如何将连字符与正则表达式匹配?

时间:2010-11-01 11:56:21

标签: c# regex

如何重写[a-zA-Z0-9!$* \t\r\n]模式以匹配连字符和现有字符?

6 个答案:

答案 0 :(得分:145)

连字符通常是正则表达式中的普通字符。只有当它在两个其他字符之间的字符类时才会有特殊意义。

因此:

  • [-]匹配连字符。
  • [abc-]匹配abc或连字符。
  • [-abc]匹配abc或连字符。
  • [ab-d]匹配abcd仅此处连字符表示字符范围)。

答案 1 :(得分:61)

逃离连字符。

[a-zA-Z0-9!$* \t\r\n\-]

<强>更新
别介意这个答案 - 你可以将连字符添加到组中但你不必逃避它。请参阅Konrad Rudolph's answer,这样可以更好地回答并解释原因。

答案 2 :(得分:12)

总是使用转义连字符不那么令人困惑,因此它不必依赖于位置。在括号中的角色类中是\-

但还有其他事情需要考虑。其中一些枚举字符应该以不同的方式编写。在某些情况下,他们肯定应该。

这种正则表达式comparison表示C♯可以使用一些更简单的Unicode属性。如果您正在处理Unicode,则应该对所有可能的字母使用常规类别\p{L},对于十进制数字,可以使用 \p{Nd}。此外,如果您想要容纳所有短划线标点符号,而不仅仅是HYPHEN-MINUS,则应使用\p{Pd}属性。您可能还想将这个空格字符序列简单地写为\s,假设这对您来说不太通用。

总之,[\p{L}\p{Nd}\p{Pd}!$*]的格式可以匹配该集合中的任何一个字符。

无论如何,即使我没有计划处理完整的Unicode集,我也可能会使用它,因为这是一个很好的习惯,因为这些东西经常超出原始参数。现在当你解除它以在其他代码中使用时,它仍然可以正常工作。如果您对所有字符进行硬编码,则不会。

答案 3 :(得分:3)

这就是你想要的吗?

MatchCollection matches = Regex.Matches(mystring, "-");

答案 4 :(得分:3)

[ - a-z0-9] +,[a-z0-9 - ] +,[az-0-9] +以及[az-0-9] +都相同。两个范围之间的连字符被认为是一个符号。还有[a-z0-9 - +()] +这个正则表达式允许连字符。

答案 5 :(得分:1)

使用&#34; \ p {Pd}&#34;没有引号可以匹配任何类型的连字符。 &#39; - &#39;字符只是一种连字符,也恰好是正则表达式中的一个特殊字符。