我想用\w
正則表達式來允許字母數字,但我不想讓下劃線_
成爲它的一部分。由於_
包含在\w
中。所以我編碼這樣,但不起作用,我的錯誤是什麼?從字母數字正則表達式中排除下劃線
(/^roger\w{2,3}[0-9a-z]/i)
我期待比AZ或1-2其他被排除任何字符
前 - roger3_2 or roger46_ or roger2_
但
roger54或roger4a或roger455或rogerAAA
應該是o ķ
我想用\w
正則表達式來允許字母數字,但我不想讓下劃線_
成爲它的一部分。由於_
包含在\w
中。所以我編碼這樣,但不起作用,我的錯誤是什麼?從字母數字正則表達式中排除下劃線
(/^roger\w{2,3}[0-9a-z]/i)
我期待比AZ或1-2其他被排除任何字符
前 - roger3_2 or roger46_ or roger2_
但
roger54或roger4a或roger455或rogerAAA
應該是o ķ
\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]
。
非常感謝您的詳細信息。 – raindrop 2012-03-28 15:59:18
假設標識符必須以字母字符開始,並且然後可以包含任意數量的字母或數字的,我這樣做:
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/
非常感謝,這非常有幫助 – raindrop 2012-03-28 15:58:50
你提出的解決方案:
(/^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})。
您的要求聽起來像你想的這些更之一:
那就是「羅傑」後面跟着一個或多個(+)或零個或多個(不區分大小寫)(*),信和/或數字。
你指出我的問題,\ w {2,3}我認爲2或3字母數字在羅傑之後會好的。你的解決方案是可以的,但我希望只允許2或3個字母數字不能少。我如何限制這一點。正如我所說我的代碼工作正常,但它允許(_),所以我不希望這是允許的。 – raindrop 2012-03-28 15:46:57
啊..我給你../^roger[0-9a-z]{2,3}/i工作。非常感謝你!! – raindrop 2012-03-28 15:58:17
我錯過了「羅傑」之後僅有2或3個字母數字的部分。我很高興你得到它。順便說一下,我假設你在做Perl。我不再確定,但它確實看起來像Perl。 – 2012-03-28 21:38:49
我試圖找到一個解決方案,這也是這個解決方案並沒有爲我工作在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]+", "");
怎麼沒有按它工作嗎?請提供更多細節。 – Bojangles 2012-03-28 15:05:48
你應該可以添加輸入和預期的輸出... – Stefan 2012-03-28 15:11:39