2012-03-28 173 views
9

我想用\w正則表達式來允許字母數字,但我不想讓下劃線_成爲它的一部分。由於_包含在\w中。所以我編碼這樣,但不起作用,我的錯誤是什麼?從字母數字正則表達式中排除下劃線

(/^roger\w{2,3}[0-9a-z]/i) 

我期待比AZ或1-2其他被排除任何字符

前 - roger3_2 or roger46_ or roger2_

roger54或roger4a或roger455或rogerAAA

應該是o ķ

+2

怎麼沒有按它工作嗎?請提供更多細節。 – Bojangles 2012-03-28 15:05:48

+0

你應該可以添加輸入和預期的輸出... – Stefan 2012-03-28 15:11:39

回答

6
  • 一個數字代碼點是\pN\p{Number}
  • 一個數字代碼點是\d,\p{digit},\p{Nd},\p{Decimal_Number}\p{Numeric_Type=Decimal}
  • 字母代碼點是\p{alpha}\p{Alphabetic}。它包括所有的\p{Digit},\p{Letter}\p{Letter_Number}碼點,以及某些\p{Mark}\p{Symbol}碼點。
  • 編程字代碼點是\w[\p{Alphabetic}\p{Digit}\p{Mark}\p{Connector_Punctuation}]

由最嚴格定義的字母數字代碼點因此必然是[\p{Alphabetic}\p{Number}],通常縮寫爲[\p{alpha}\pN]

+0

非常感謝您的詳細信息。 – raindrop 2012-03-28 15:59:18

23

你可以嘗試這樣的:

[^_\W]+ 
+0

簡單但非常有效,非常感謝! – raindrop 2012-03-28 16:04:13

3

假設標識符必須以字母字符開始,並且然後可以包含任意數量的字母或數字的,我這樣做:

my $string = 'roger54a'; 
print "Match\n" if $string =~ m/\A\p{alpha}[\p{alpha}\p{Number}]*\z/; 

錨定至串的開頭和結尾,排除任何字符不匹配單個alpha的特定集合,後跟任意數量的alpha和數字。

更新:我看到tchrist剛剛給出了Unicode屬性的一個很好的解釋。這個答案提供了完整的正則表達式的上下文。

如果你想領先的「阿爾法」是兩個或三個數字後面的字母數字,只需添加相應的量詞:

$string =~ m/\A\p{alpha}{2,3}[\p{alpha}\p{Number}]*\z/

UPDATE2:我看到你更強的定義」在這裏重新尋找對其中一個答案的評論。這是我對其採取看到你的澄清後:

m/\Aroger[\p{alpha}\p{Number}]{2,3}\z/

+0

非常感謝,這非常有幫助 – raindrop 2012-03-28 15:58:50

2

你提出的解決方案:

(/^roger\w{2,3}[0-9a-z]/i) 

方式:

\w{2,3} - 2或3個字母數字,包括_

[0-9a-z](帶/ i) - 字母數字的單個字符,不包括_

我在開始時沒有看到任何可接受的3位字母數字。這屬於嗎?

「roger54」和「roger4a」都應該失敗,因爲上述正則表達式需要至少三個字符在「roger」之後。同樣,「roger_ a」會成功,因爲「_」通過\ w {2,3}(特別是\ w {3})。

您的要求聽起來像你想的這些更之一:

那就是「羅傑」後面跟着一個或多個(+)或零個或多個(不區分大小寫)(*),信和/或數字。

+0

你指出我的問題,\ w {2,3}我認爲2或3字母數字在羅傑之後會好的。你的解決方案是可以的,但我希望只允許2或3個字母數字不能少。我如何限制這一點。正如我所說我的代碼工作正常,但它允許(_),所以我不希望這是允許的。 – raindrop 2012-03-28 15:46:57

+0

啊..我給你../^roger[0-9a-z]{2,3}/i工作。非常感謝你!! – raindrop 2012-03-28 15:58:17

+0

我錯過了「羅傑」之後僅有2或3個字母數字的部分。我很高興你得到它。順便說一下,我假設你在做Perl。我不再確定,但它確實看起來像Perl。 – 2012-03-28 21:38:49

0

我試圖找到一個解決方案,這也是這個解決方案並沒有爲我工作在C#時嘗試做一個正則表達式替換。如果別人在搜索:

c# Regex.Replace [^\w ] that also removes underscores?

這是我在C#中使用:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w]+]", "");

如果你想保留空間:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w\s]+", "");