关于正则表达式:正则表达式 – 连字符是否应该被转义?

Regex - Should hyphens be escaped?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to match hyphens with Regular Expression?

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

1
[0-9A-F]

但在方括号之外,它只是一个普通字符,对吗?我在两个在线regex测试仪上测试过,连字符在方括号之外(甚至在方括号内,如果它不在两个字符之间,例如[-g]似乎匹配-或g),那么连字符似乎是正常字符,不管它是否被转义。我找不到这个问题的答案,但我想知道是否是传统的避免连字符。

谢谢!


各方面正确。在字符类(即所谓的"方括号")之外,连字符没有特殊含义,在字符类内,可以将连字符作为范围内的第一个或最后一个字符(例如,[-a-z][0-9-])放置,或将其转义(例如,[a-z\-0-9])以便向类中添加"连字符"。

在角色类中,最常见的是在第一个或最后一个位置放置连字符,但决不会因为选择逃避而被一群愤怒的大胡子私刑。

(实际上…我的经验是,很多regex是由那些不完全摸索语法的人使用的。在这些情况下,你通常会看到所有的东西都逃走了(例如[a-z\%\$\#\@\!\-\_]),仅仅是因为工程师不知道什么是"特殊"什么不是…因此,他们"安全地使用它",并用大量的反斜杠混淆表达式。在使用regex语法之前,您将花时间真正理解它,从而为您自己、您的同龄人和您的后代带来巨大的好处。)

好问题!


在字符类之外,通常不转义连字符。如果我在字符类之外看到一个转义的连字符,这就意味着它是由一个对正则表达式不太满意的人编写的。

在字符类中,我不认为一种方法比另一种方法更为传统;根据我的经验,它通常似乎是放在第一或最后,如在[-._:][._:-]中,以避免反斜杠;但我也经常看到它是相反地逃跑的,如在[._\-:]中,我不会称之为非传统的。


通常,您总是将连字符放在[]匹配部分的第一位。例如,要匹配包括连字符在内的任何字母数字(以长方式写入),您将使用[-a-zA-Z0-9]