如何重写 [a-zA-Z0-9!$* \t\r\n]
模式以使连字符和现有字符匹配?
Answers:
转义连字符。
[a-zA-Z0-9!$* \t\r\n\-]
更新:
没关系,这个答案-您可以将连字符添加到组中,但不必转义。请参阅Konrad Rudolph的答案,这样做的回答要好得多,并解释原因。
连字符通常是正则表达式中的普通字符。只有在字符类中并且在其他两个字符之间时,它才具有特殊含义。
从而:
[-]
匹配连字符。[abc-]
比赛a
,b
,c
或连字符。[-abc]
比赛a
,b
,c
或连字符。[ab-d]
匹配a
,b
,c
或d
(这里只连字符表示一个字符范围)。[a-c-e]
:在某些正则表达式规范/引擎中,这完全是无效的。例如,POSIX正则表达式不允许它。
始终使用转义的连字符会减少混乱,因此不必依赖于位置。这是\-
放在方括号内的字符类的内部。
但是还有其他事情要考虑。这些枚举字符中的某些字符可能应该用不同的方式书写。在某些情况下,他们绝对应该这样做。
这个比较正则表达式的味道说,C♯可以用一些简单的Unicode属性的。如果你正在处理Unicode的,你应该使用一般类别\p{L}
的所有可能的字母,也许 \p{Nd}
为十进制数。另外,如果您想容纳所有破折号,而不仅仅是HYPHEN-MINUS,则应使用该\p{Pd}
属性。您可能还想简单地将这一系列空格字符写成\s
,假设这对您来说不太普遍。
总而言之,这相当于[\p{L}\p{Nd}\p{Pd}!$*]
一个模式,以匹配该集合中的任何一个字符。
即使我不打算处理完整的Unicode集,我仍然可能会使用它,因为这是一种很好的习惯,而且这些东西通常超出了其原始参数。现在,当您提起它以在其他代码中使用时,它仍然可以正常工作。如果您对所有字符进行硬编码,则不会。
使用不带引号的“ \ p {Pd}”来匹配任何类型的连字符。“-”字符只是连字符的一种,在正则表达式中也恰好是特殊字符。