正则表达式 - 连字符应该被转义吗?

JSi*_*ris 167 regex

可能重复:
如何将连字符与正则表达式匹配?

连字符是正则表达式中的一个特殊字符,例如,要选择范围,我可以执行以下操作:

[0-9A-F]
Run Code Online (Sandbox Code Playgroud)

但是在方括号之外它只是一个普通的角色吗?我一对夫妇网上正则表达式测试仪进行了测试,连字符似乎充当方括号外的普通字符(甚至内方括号的,如果不是两个之间的字符 - 例如,[-g]似乎匹配 - 或g)是否逃脱.我找不到答案,但我想知道是否传统的逃避连字符.

谢谢!

Chr*_*son 254

各方面都要正确.在字符类之外(这就是所谓的"方括号"),连字符没有特殊含义,在字符类中,您可以将连字符作为范围中的第一个或最后一个字符(例如[-a-z][0-9-]),或者转义它(例如[a-z\-0-9])为了给你的班级添加"连字符".

在角色类中首先或最后找到一个连字符更为常见,但绝不会被大量愤怒的颈带私下用来选择逃避它.

(实际上......我的经验是,那些没有完全理解语法的人会使用很多正则表达式.在这些情况下,你通常会看到一切都被逃脱(例如[a-z\%\$\#\@\!\-\_])因为工程师不知道什么是"特别",什么不是......所以他们"安全地玩"并用过多的反斜杠模糊表达.你会花时间真正理解正则表达式,为自己,同时代人和后人做一件大事.使用它之前的语法.)

好问题!

  • +1帮助我理解"成群愤怒的颈部"的心理:D (13认同)
  • 关于那些不完全理解并希望"安全地玩"的人过度逃避的有趣观点 (3认同)
  • 我认为有人可能会争辩说"用过多的反斜杠来模糊表达式"可能实际上是倒退.我认为*大多数*使用正则表达式的人都没有完全理解语法.在这种情况下,过多的反斜杠可能会使大多数人更清楚.这并不是说这是正确的做事方式,但至少可以为这个立场做出争论. (3认同)
  • 一个非常有用的答案.事实证明,在Eclipse Luna中,如果你试图逃避它,Java Linter会抱怨. (2认同)
  • @ChrisTonkinson:在那种情况下,当然不是.但我所假设的是冗余解释的读者缺少的知识.举个例子,在`var x =(4*4)+ 1`中有多余的括号.但如果读者不知道操作顺序,那么这些括号*会*使其更清晰.我的观点并不是说任何冗余都会使事情变得更加清晰,但冗余*可以在读者不知道的情况下使事情更加清晰. (2认同)

rua*_*akh 13

在字符类之外,通常不要逃避连字符.如果我在角色类之外看到一个逃脱的连字符,那就告诉我它是由一个对正则表达式不太熟悉的人写的.

在内部角色类中,我认为一种方式不是传统方式而是另一种方式; 根据我的经验,通常似乎是放在第一个或最后一个,如在[-._:][._:-],以避免反斜杠; 但我也经常看到它,而不是逃脱,如[._\-:],我不认为这是联合国常规.


Wes*_*ker 7

通常,您始终将连字符放在[]匹配部分中.EG,要匹配任何字母数字,包括连字符(写得很长),你会用[-a-zA-Z0-9]