2010-10-20 341 views

回答

13

你可以使用

/[^\w\s]/ 

這所有非單詞字符(\ W)和非空白(\ S)相匹配。

編輯:

/[^\w ]/ 

如果你只想要忽略空格(不是所有的空格)。

UPDATE:

刪除i,因爲它是沒有必要的(見幾個評論)。

+4

請注意,這與非WORD字符匹配,但Joe說他想匹配非ALPHANUMERIC字符。 '\ w'包括(和'\ W'不包括)至少一個非字母數字,'_'。你會希望使用'/ [^ a-z0-9 \ s]/i'來排除字母和數字。假設你不關心重音字符等,這會打開一大堆其他的蠕蟲。 – Porculus 2010-10-20 01:43:40

+2

你不需要'/ i'修飾符 - '/ w'已經不區分大小寫。 – 2010-10-20 06:35:43

8

對於大多數用途,[^\w\s]應該就足夠了。這隻匹配一個既不是「alphanumunder」也不是PerlSpace的字符。

這幾乎,但不是很喜歡稱它匹配任何東西既不是\p{Alphabetic}也不\p{Digit}也不下劃線(LOW LINE),也不\p{WhiteSpace},除了關於CHR 11,垂直選項卡中的weaseling,因爲這是考慮\s,儘管它認爲是\p{WhiteSpace}

\s速記真的menas \p{PerlSpace}\p{WhiteSpace}\p{Space}\p{WhiteSpace}相同。唯一的\S字符(意思是,不是\s)這也是\p{Space}是那個討厭的垂直標籤。請注意,垂直選項卡包含在\v中,因此對於任何垂直或水平白色空間,這意味着[\v\h]\p{Space}相同,而不是\s

我現在要對字母數字更精確。爲了簡單起見,我要談論積極的匹配。應該很容易反轉邏輯以獲得負面匹配。

如果是「字母數字」,你的意思是字母或數字,你應該使用正是這個意思的屬性。 \pL\p{Letter}的簡稱,可能涵蓋那些。所有字母都是字母,但字符,它們是\p{Alphabetic},但不是\p{Letter},如羅馬數字,圓圈字母和各種變音符號。

對於數字,問題是否意味着只包含數字,還是其他數字都可以。 \pN\p{Number}的簡稱,但包含大量的非數字。 \d\p{Nd}的簡寫,而\p{Decimal_Number}又是簡寫,儘管\p{Digit}也可以正常工作。不是數字的數字包括羅馬數字,粗俗分數,上標數字和圓圈數字。

從Perl 5開始。11,除了0​​,\p{POSIX_Alpha}只有字母和\p{POSIX_Alnum}兩者,你可以使用\p{POSIX_Digit}等屬性。還有一個\p{POSIX_Space}與該版本或更好,涵蓋字符9-13加上32 只有,完全忽略了其他20個其他空白字符後來。

在此之前,仍然可以通過使用前瞻斷言來限制匹配爲ASCII範圍,使用/(?=\p{ASCII})[\p{Alpha}\p{Digit}]/來限制匹配,儘管將字符限制爲7位是非常後千年。

我可能會讓他們使用羅馬數字,但不是特殊的變音符號,所以會使用/[\p{Letter}\p{Digit}]/,如果您願意,可以將其縮短爲/[\pL\d]/

現在您將空白添加到\s或稍寬的\p{Space},給出/[\p{Letter}\p{Digit}\p{Space}]/。我也會以這種形式離開它,因爲我認爲你的意思更清晰。

爲了否定這一點,您可能會認爲以!作爲前綴,但這並不完全相同,因爲空字符串會匹配。所以你應該在字符類的開頭加上一個字符來補充該字符集,使其成爲/[^\p{Letter}\p{Digit}\p{Space}]/

你可以只需扳動意義上的\p\P,而不是你可以用一個單一屬性的方式,因爲/[\P{Letter}\P{Digit}\P{Space}]/會碰到一些非數字字母字符,(白)空格字符都是非數字,數字字符是nonspaces等

儘管如此,仍然沒有理由使用/i

2
[^\p{Alnum}\d ] # NOT alnum or space