如何重写模式
[a-zA-Z0-9!$* \t\r\n]
以匹配连字符和现有字符?连字符通常是正则表达式中的普通字符。只有当它在字符类中,并且位于两个其他字符之间时,才具有特殊含义。您可以转义字符类中的连字符,但不需要这样做。
因此:
-
匹配连字符。[-]
匹配连字符。[abc-]
匹配 a
、b
、c
或 连字符。[-abc]
匹配 a
、b
、c
或 连字符。[ab\-c]
匹配 a
、b
、c
或 连字符。[ab-d]
匹配 a
、b
、c
或 d
(仅在此处连字符表示字符范围)。[a-c-e]
中的解释:在某些正则表达式规范/引擎中,这是无效的。例如,POSIX 正则表达式就不允许它。 - Konrad Rudolph[%--]
matches any character between %
and -
(inclusive). [--@]
matches any character between -
and @
(inclusive). The notation [%--@]
is invalid as it is ambiguous. So a hyphen only is a hyphen if it is first or last in the group. So this is valid [--@%--]
but this is not [%----@]
- kvantour转义连字符。
[a-zA-Z0-9!$* \t\r\n\-]
更新:
不用在意这个答案 - 你可以在组中添加连字符,但不需要转义它。请查看Konrad Rudolph的答案,该答案回答得更好,并解释了原因。
为了避免位置相关的问题,最好使用转义连字符。这是方括号字符类中的一个\-
。
但是还有其他要考虑的事情。一些列举的字符可能应该以不同的方式编写。在某些情况下,它们确实应该这样做。
此正则表达式风格的比较表明,C♯可以使用一些更简单的Unicode属性。如果你正在处理Unicode,你应该使用一般类别\p{L}
表示所有可能的字母,以及可能的\p{Nd}
表示十进制数字。此外,如果您想容纳所有的破折号标点,而不仅仅是HYPHEN-MINUS,则应使用\p{Pd}
属性。 假设对于您来说这并不太普遍,您可能还希望将这个空白字符序列简单地写成\s
。
总的来说,这就是一个匹配该集合中任何一个字符的模式:[\p{L}\p{Nd}\p{Pd}!$*]
。
即使我没有打算处理完整的Unicode集合,我也可能会使用它,因为这是一个好习惯,而且因为这些东西经常超出其原始参数。现在,当您将其提升以在其他代码中使用时,它仍将正确工作。如果您硬编码所有字符,则不会。
[-a-z0-9]+,[a-z0-9-]+,[a-z-0-9]+以及[a-z-0-9]+都是相同的。两个范围之间的连字符被视为符号。并且[a-z0-9-+()]+这个正则表达式允许使用连字符。
您需要的是这个吗?
MatchCollection matches = Regex.Matches(mystring, "-");