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


81

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


您可以添加\ s而不是添加空格和\ t。\ s也可以匹配其他类型的空格
Radu Simionescu

Answers:


71

转义连字符。

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

更新
没关系,这个答案-您可以将连字符添加到组中,但不必转义。请参阅Konrad Rudolph的答案,这样做的回答要好得多,并解释原因。


哦是吗 那是因为它在角色组中吗?我的错。
尼尔·巴恩威尔

11
@KonradRudolph您是正确的,但我不确定未转义的版本是否易于理解。破折号的两种可能用法令人困惑,这就是为什么对此有疑问的原因。一旦知道它,它肯定会更优雅,但是对于初学者来说,这有点令人困惑。
Christophe Roussy 2014年

182

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

从而:

  • [-] 匹配连字符。
  • [abc-]比赛abc或连字符。
  • [-abc]比赛abc或连字符。
  • [ab-d]匹配abcd这里只连字符表示一个字符范围)。

1
@rrr您想让他为您编写以及拼写出来吗?您需要做的就是将连字符添加到组中。
尼尔·巴恩韦尔

10
@rrrr:我相信我已经给出了答案。问题是“如何写'X'...”,我相信我已经解释了如何做到这一点。拿出我的答案并将解释应用于当前的实际表达方式,不需要比一年级学生更高的认知能力。实际上,这正是一年级学生学习基础算术时所学的。随时纠正我的假设。
Konrad Rudolph


2
@MarkP好吧,呵呵:字符十六进制代码由前端解析器(使用C#,JavaScript或您使用的任何语言)转换为实际字符。因此,就字符串的值而言,使用十六进制代码与使用实际字符相同。
康拉德·鲁道夫

1
@Pshemo当然是愚蠢的错误。关于中的解释[a-c-e]:在某些正则表达式规范/引擎中,这完全是无效的。例如,POSIX正则表达式不允许它。
康拉德·鲁道夫

12

始终使用转义的连字符会减少混乱,因此不必依赖于位置。这是\-放在方括号内的字符类的内部。

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

这个比较正则表达式的味道说,C♯可以用一些简单的Unicode属性的。如果你正在处理Unicode的,你应该使用一般类别\p{L}的所有可能的字母,也许 \p{Nd}为十进制数。另外,如果您想容纳所有破折号,而不仅仅是HYPHEN-MINUS,则应使用该\p{Pd}属性。您可能还想简单地将这一系列空格字符写成\s,假设这对您来说不太普遍。

总而言之,这相当于[\p{L}\p{Nd}\p{Pd}!$*]一个模式,以匹配该集合中的任何一个字符。

即使我不打算处理完整的Unicode集,我仍然可能会使用它,因为这是一种很好的习惯,而且这些东西通常超出了其原始参数。现在,当您提起它以在其他代码中使用时,它仍然可以正常工作。如果您对所有字符进行硬编码,则不会。


我倾向于同意这个答案,您越需要知道越安全的代码。这让我想起了操作员优先事项的问题:stackoverflow.com/questions/10007140/…,我希望在其中加上括号(由我的IDE自动添加),而无需全部了解。您或其他人可能迟早会陷入困境。当然,如果您在项目中经常使用正则表达式,则可能需要具备更高级的知识。
Christophe Roussy 2014年

4

[-a-z0-9] +,[a-z0-9-] +,[az-0-9] +和[az-0-9] +都相同。两个范围之间的连字符被视为a符号。还有[a-z0-9-+()] +此正则表达式允许使用连字符。


应该是最好的答案之一。
剃刀边缘

3

这是你所追求的吗?

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.