关于c#:如何将连字符与正则表达式匹配?

How to match hyphens with Regular Expression?

如何重写[a-zA-Z0-9!$* \t

]模式以匹配连字符和现有字符?


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

因此:

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


去掉连字符。

1
2
3
[a-zA-Z0-9!$* \t

\-]

更新:别介意这个答案-你可以将连字符添加到组中,但是你不必逃避它。请看康拉德·鲁道夫的回答,它在回答问题上做得更好,并解释了原因。


总是使用转义连字符比较容易混淆,这样就不必依赖于位置。这是括号字符类中的一个\-

但是还有其他的事情要考虑。有些枚举字符的编写方式可能有所不同。在某些情况下,他们肯定应该这样做。

比较一下雷吉克斯的口味就可以看出C?可以使用一些更简单的Unicode属性。如果您处理的是Unicode,那么可能应该对所有可能的字母使用通用类别\p{L},对十进制数字使用\p{Nd}。此外,如果您想适应所有的破折号标点,而不仅仅是连字符-减号,您应该使用\p{Pd}属性。您可能还希望将空白字符序列简单地写为\s,假设这对您来说不太一般。

总而言之,这是为了让[\p{L}\p{Nd}\p{Pd}!$*]的apattern与该集合中的任何一个字符相匹配。

不管怎样,我可能会使用它,即使我没有计划处理完整的Unicode集,因为这是一个很好的习惯,而且因为这些东西经常超出它们的原始参数。现在,当您将其提升到其他代码中使用时,它仍然可以正常工作。如果你硬编码所有的字符,它不会。


[-A-Z0-9]+、[A-Z0-9-]+、[A-Z-0-9]+和[A-Z-0-9]+都是相同的。两个范围之间的连字符被视为一个符号。而且[A-Z0-9-+()]+这个regex允许连字符。


这就是你想要的吗?

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

使用不带引号的"p pd"来匹配任何类型的连字符。"-"字符只是一种连字符,它在regex中也恰好是一种特殊字符。