【发布时间】:2011-05-03 09:20:16
【问题描述】:
如何重写[a-zA-Z0-9!$* \t\r\n] 模式以匹配连字符和现有字符?
【问题讨论】:
-
可以添加\s,而不是添加空格和\t。 \s 也匹配其他类型的空格
如何重写[a-zA-Z0-9!$* \t\r\n] 模式以匹配连字符和现有字符?
【问题讨论】:
连字符通常是正则表达式中的普通字符。仅当它在一个字符类中并且在其他两个字符之间时,它才具有特殊含义。
因此:
[-] 匹配连字符。[abc-] 匹配 a、b、c 或连字符。[-abc] 匹配 a、b、c 或连字符。[ab-d] 匹配 a、b、c 或 d(仅在此处连字符表示字符范围)。【讨论】:
[a-c-e] 中的解释:这在某些正则表达式规范/引擎中根本无效。例如,POSIX 正则表达式不允许它。
转义连字符。
[a-zA-Z0-9!$* \t\r\n\-]
更新:
不要介意这个答案 - 您可以将连字符添加到组中,但您不必转义它。请参阅Konrad Rudolph's answer,而不是在回答和解释原因方面做得更好。
【讨论】:
总是使用转义的连字符更容易混淆,因此它不必依赖于位置。那是括号字符类中的\-。
但还有其他需要考虑的事情。其中一些枚举字符可能应该以不同的方式书写。在某些情况下,他们绝对应该这样做。
comparison 的正则表达式风格说 C♯ 可以使用一些更简单的 Unicode 属性。如果您正在处理 Unicode,您可能应该使用通用类别 \p{L} 来表示所有可能的字母,也许 \p{Nd} 来表示十进制数字。此外,如果您想容纳所有破折号标点符号,而不仅仅是连字符减号,您应该使用\p{Pd} 属性。您可能还想将该空白字符序列简单地写为\s,假设这对您来说不是太笼统。
总而言之,[\p{L}\p{Nd}\p{Pd}!$*] 的模式可以匹配该集合中的任何一个字符。
我可能会使用它,即使我不打算处理完整的 Unicode 集,因为这是一个好习惯,而且因为这些东西经常超出它们的原始参数。现在,当您将其提升以在其他代码中使用时,它仍然可以正常工作。如果您硬编码所有字符,则不会。
【讨论】:
[-a-z0-9]+,[a-z0-9-]+,[az-0-9]+ 和 [az-0-9]+ 都是一样的。两个范围之间的连字符被视为一个符号。而且 [a-z0-9-+()]+ 这个正则表达式允许连字符。
【讨论】:
这就是你所追求的吗?
MatchCollection matches = Regex.Matches(mystring, "-");
【讨论】:
使用不带引号的“\p{Pd}”来匹配任何类型的连字符。 '-' 字符只是连字符的一种,它也恰好是正则表达式中的特殊字符。
【讨论】: