正则表达式-是否应该转义连字符?

236
连字符是正则表达式中的特殊字符,例如,要选择一个范围,我可以这样做:
[0-9A-F]

但是在方括号之外,它只是一个普通字符对吧?我在几个在线正则表达式测试工具上测试过了,连字符似乎在方括号之外(甚至在方括号之内,如果它不在两个字符之间的话 - 例如[-g]似乎匹配-或g)无论是否转义都会作为普通字符来处理。我找不到这个问题的答案,但我想知道是否习惯性地转义连字符。

5
取决于你使用哪种语言来表示不规则表达式。 - zzzzBov
3
这里有一篇类似的帖子,应该能回答你的问题:https://dev59.com/Km855IYBdhLWcg3w75Eu#4068725 - Omer Bokhari
11
我不认为这是完全重复的。那个问题是在问如何转义连字符。我已经知道如何转义它们并且正在询问是否需要转义。答案有些重叠无关紧要,因为问题的本质不同。请重新打开。 - JSideris
5
所谓的“dupe”只涉及特定的语言,一些答案也是如此。 - jwg
在Unix的grep程序中,无论连字符(-)在模式中的位置如何,您都必须始终进行转义。 - bloody
3个回答

355

各方面都是正确的。在字符类之外(这就是"方括号"的名称),连字符没有特殊含义;在字符类中,您可以将连字符放置在范围的第一个或最后一个字符(例如 [-a-z][0-9-]转义它(例如 [a-z\-0-9])以添加“连字符”到您的类。

在字符类中,将连字符放置在第一个或最后一个位置更为常见,但如果选择转义它,也不会受到怒气冲天的技术专家们的指责。

(实际上…我的经验是许多使用正则表达式的人并没有完全理解语法。在这些情况下,您通常会看到所有内容都已转义(例如 [a-z\%\$\#\@\!\-\_]),只是因为工程师不知道哪些是“特殊”的,哪些不是…所以他们“安全起见”用大量多余的反斜杠混淆表达式。在使用之前花时间真正了解正则表达式语法,将为您自己、您的同事和您的后代带来巨大的好处。)

好问题!


5
那些不太理解却想“保险起见”而过度转义的人存在一个有趣的观点。 - user
2
一个非常有用的答案。事实证明,在Eclipse Luna中,如果您尝试转义Java Linter,它会发出警告。 - Keab42
7
我认为有人可能会认为在正则表达式中使用大量过多的反斜杠并不是一个正确的做法。我认为大多数使用正则表达式的人并不完全理解其语法。在这种情况下,过多的反斜杠可能会使大多数人更清晰地理解它。这并不是说这是正确的做法,但至少可以为这种观点提供一个论据。 - Shiania White
2
@ChrisTonkinson:在那种情况下,它当然并不重要。但是我假设读者缺乏某些知识,冗余可以弥补这些知识缺失。所以拿你的例子来说,在var x = (4 * 4) + 1中存在多余的括号。但是如果读者不知道运算顺序,那么这些括号确实会使它更清晰。我的观点不是任何冗余都能使事情更清晰,而是冗余可以在读者不知道时使事情更清晰。 - Shiania White
1
是的,我认为我理解了你的观点,然而我不得不再次反对你的结论,仅仅因为我的原始主张是一个请求“在使用正则表达式之前花时间真正理解它的语法”,并且观察到很多人经常没有做到这一点。 - Chris Tonkinson
显示剩余3条评论

22

在字符类之外,通常不需要转义连字符。如果我看到一个转义的连字符在字符类之外,那么我会认为它是由不太熟悉正则表达式的人编写的。

在字符类之内,我认为没有一种方法比另一种更加传统;根据我的经验,通常会将其放在开头或结尾,例如[-._:][._:-],以避免使用反斜杠; 但我也经常看到被转义的连字符,例如[._\-:],我不认为这样做是不传统的。


1
Bash 不能完全处理正则表达式模式,或者说它仍然采用一些旧的方式,这并不意味着某个人对正则表达式不熟悉。只是这就是 Bash 的方式... 就是这样。 - user3999721

12

通常在[]匹配部分中,您总是会先放连字符。例如,要匹配包括连字符在内的任何字母数字字符(长格式),您应该使用[-a-zA-Z0-9]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接