Regex - Should hyphens be escaped?
Possible Duplicate:
How to match hyphens with Regular Expression?
连字符是regex中的一个特殊字符,例如,要选择一个范围,我可以执行如下操作:
但在方括号之外,它只是一个普通字符,对吗?我在两个在线regex测试仪上测试过,连字符在方括号之外(甚至在方括号内,如果它不在两个字符之间,例如[-g]似乎匹配-或g),那么连字符似乎是正常字符,不管它是否被转义。我找不到这个问题的答案,但我想知道是否是传统的避免连字符。
谢谢!
- 它取决于您使用哪种语言来表示不规则表达式。
- 这里有一篇类似的文章可以回答你的问题:stackoverflow.com/a/4068725/56829
- 我看不出这是怎么回事。这个问题是问如何避免连字符。我已经知道如何逃离他们,并询问是否有必要逃离他们。有些答案重叠的事实是不相关的,因为问题的性质是不同的。请重新打开。
- 所谓的dupe只指一种特定的语言,它的一些答案也是如此。
各方面正确。在字符类(即所谓的"方括号")之外,连字符没有特殊含义,在字符类内,可以将连字符作为范围内的第一个或最后一个字符(例如,[-a-z]或[0-9-])放置,或将其转义(例如,[a-z\-0-9])以便向类中添加"连字符"。
在角色类中,最常见的是在第一个或最后一个位置放置连字符,但决不会因为选择逃避而被一群愤怒的大胡子私刑。
(实际上…我的经验是,很多regex是由那些不完全摸索语法的人使用的。在这些情况下,你通常会看到所有的东西都逃走了(例如[a-z\%\$\#\@\!\-\_]),仅仅是因为工程师不知道什么是"特殊"什么不是…因此,他们"安全地使用它",并用大量的反斜杠混淆表达式。在使用regex语法之前,您将花时间真正理解它,从而为您自己、您的同龄人和您的后代带来巨大的好处。)
好问题!
- 有意思的一点是,那些不完全理解并想"安全"的人会过度逃逸。
- +1.帮助我理解"一群愤怒的大胡子"的心理:d
- 一个非常有用的答案。事实证明,在Eclipse LUNA中,如果您试图逃避它,Java Link将抱怨。
- 我认为有人可能会说,obfuscate the expression with loads of excessive backslashes实际上是向后的。我认为大多数使用regex的人不会完全摸索语法。在这种情况下,过多的反斜杠可能使大多数人更清楚。这并不是说这是做事情的正确方式,但至少有一个论点可以支持这个立场。
- @什叶派,我不确定我是否同意。我想我理解你的观点,但是把下面的表达作为一个无关紧要的对位:var x = 4 * 4 + 1对var x = (((4) * (4)) + (1))。在这两种情况下,我都设置了x = 17,但在第二个版本中,我在所有内容周围添加了额外的括号,只是为了更清楚地说明这一点——只是它的作用正好相反。
- @克里斯托金森:在这种情况下,当然不会。但我假设的是,读者缺乏冗余解释的知识。以你的例子来说,在var x = (4 * 4) + 1中有多余的括号。但是如果读者不知道操作的顺序,那么这些括号确实使它更清晰。我的观点不是说任何冗余都能让事情更清楚,但是冗余可以让事情更清楚,以防读者不知道。
- 是的,我认为我确实理解你的观点,但是我不得不再次反对你的结论,如果仅仅基于我最初的主张是请求"在使用之前花点时间真正理解regex语法",并且观察到人们经常做不到这一点。
- 警告!escape-it(例如[a-z\-0-9])在Oracle(11g)中不起作用。它与连字符不匹配。
在字符类之外,通常不转义连字符。如果我在字符类之外看到一个转义的连字符,这就意味着它是由一个对正则表达式不太满意的人编写的。
在字符类中,我不认为一种方法比另一种方法更为传统;根据我的经验,它通常似乎是放在第一或最后,如在[-._:]或[._:-]中,以避免反斜杠;但我也经常看到它是相反地逃跑的,如在[._\-:]中,我不会称之为非传统的。
通常,您总是将连字符放在[]匹配部分的第一位。例如,要匹配包括连字符在内的任何字母数字(以长方式写入),您将使用[-a-zA-Z0-9]。