如何重写[a-zA-Z0-9!$* \t\r\n]
模式以匹配连字符和现有字符?
答案 0 :(得分:145)
连字符通常是正则表达式中的普通字符。只有当它在两个其他字符之间的字符类和时才会有特殊意义。
因此:
[-]
匹配连字符。[abc-]
匹配a
,b
,c
或连字符。[-abc]
匹配a
,b
,c
或连字符。[ab-d]
匹配a
,b
,c
或d
(仅此处连字符表示字符范围)。 答案 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;字符只是一种连字符,也恰好是正则表达式中的一个特殊字符。