我有這個代碼用「 - 」字符替換所有非字母數字字符。Regexp刪除任何非字母數字,但在一個表達式中保留一些特殊字符
return Regex.Replace(strIn, @"[\W|_]+", "-", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
,但我需要改變它允許通過一些特殊的字符(一個或多個),例如:#,*,%
如何改變這個正則表達式?
我有這個代碼用「 - 」字符替換所有非字母數字字符。Regexp刪除任何非字母數字,但在一個表達式中保留一些特殊字符
return Regex.Replace(strIn, @"[\W|_]+", "-", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
,但我需要改變它允許通過一些特殊的字符(一個或多個),例如:#,*,%
如何改變這個正則表達式?
另一種選擇,你可以使用字符內類減法info,例如將字符類中刪除#
:
[\W_-[#]]+
的#
後只需添加其他公認的特殊字符。住在這裏例如:http://rextester.com/rundotnet?code=YFQ40277
使用
[^\p{L}\p{N}#*%]+
此相匹配的一個或多個不是字母也不是數字的字符,也不是#
,*
或%
。
+1我不知道\ p令牌:) –
無法使其工作:(:'解析「[^ \ pL \ pN#*%] +」 - 格式錯誤\ p {X}字符轉義。 ' – Alexei
嘗試'[^ \ p {L} \ p {N}#*%] +'。當屬性名稱只是一個字母時,它應該沒有大括號,但在.NET中它們似乎是必需的 –
您可以使用set減法爲:
@"[\W_-[#*%]]+"
這個集合的所有非字字符和下劃線,減去集#
,*
和%
匹配。
請注意,您不必在字符類中爲「或」使用|
,因爲這是隱含的。事實上,你的正則表達式中的|
只是匹配|
。
另請注意,在.NET中,\w
與下劃線以外的其他幾個「連接符」標記符相匹配。如果你想在其他人物也匹配,您可以使用
@"[\W\p{Pc}-[#*%]]+"
看來這種方式是你最好的解決方案
@"(?!.*[^\w#*%])"
我不這麼認爲。 [^ \ w#*%])'意思是,「從當前位置向前看,沒有與[[\ w#*%]'」不匹配的字符。「)不需要任何字符,所以它會一直匹配,並且不消耗任何字符,所以它不能用於刪除任何東西。 –
它工作的很好!感謝減法幫助,酷測試! – Alexei