我有这段代码,它将所有非字母数字字符替换为"-"字符。
return Regex.Replace(strIn, @"[\W|_]+", "-", RegexOptions.IgnorePatternWhitespace | RegexOptions.IgnoreCase);
但我需要更改它以允许通过一些特殊字符(一个或多个),例如:#,*,%
如何更改这个正则表达式?
使用
[^\p{L}\p{N}#*%]+
这将匹配一个或多个既不是字母也不是数字,也不是#
、*
或%
中任何一个字符的字符。
[^a-zA-Z0-9#*%]+
[^\p{L}\p{N}#*%]+
Ä
是一个字母。.NET 认为是,并将其包含在 \w
中。 - Tim Pietzcker另一个选项是使用字符类减法信息,例如从字符类中删除#
:
[\W_-[#]]+
#
后添加其他可接受的特殊字符即可。这里有一个实时示例:http://rextester.com/rundotnet?code=YFQ40277。使用这个。
([^\w#*%]|_)
在 % 后添加任何其他特殊字符。
它基本上是说,匹配任何不是(^)单词字符(\w),#,*或%的字符,或者匹配 _。
看起来这种方式对你来说是最好的解决方案
@"(?!.*[^\w#*%])"
(?!.*[^\w#*%])
的意思是,“从当前位置向前查找,没有一个字符与[\w#*%]
不匹配”。它不需要任何字符存在,因此它总是匹配的,并且它不会消耗任何字符,因此它不能用于删除任何内容。 - Alan Moore@"[\W_-[#*%]]+"
这个正则表达式匹配所有非单词字符和下划线,减去 #
、*
和 %
这些字符。
请注意,在字符类中不必使用 |
表示“或”,因为这是隐含的。实际上,你的正则表达式中的 |
只匹配 |
字符本身。
另外请注意,在 .NET 中,\w
匹配除了下划线以外的一些“连接标点符号”字符。如果你想要匹配这些字符,可以使用
@"[\W\p{Pc}-[#*%]]+"
解析"[^\pL\pN#*%]+" - \p{X}字符转义格式错误。
- Alexei[^\p{L}\p{N}#*%]+
。当属性名称只有一个字母时,它应该可以在没有括号的情况下工作,但是在.NET中,当它位于另一个字符类中时,似乎需要括号。 - Alan Moore\p{L}
语法。我会更新的。 - Tim Pietzcker