首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PCRE和ERE对每个元字符进行转义是错误的吗?

使用PCRE和ERE对每个元字符进行转义是错误的吗?
EN

Stack Overflow用户
提问于 2012-12-02 20:32:58
回答 3查看 115关注 0票数 1

在正则表达式中,一些字符只有在适当放置的情况下才能获得元字符的特殊含义,否则将保持其原义。例如,仅当放在方括号表达式[]内时,-字符才被视为元字符,并且是外部的文字破折号。

但就我个人而言,我喜欢将元字符视为保留字符,并采用严格的规则来转义每个需要为文字的元字符。这为我节省了一些时间,否则我将花费在考虑元字符在正则表达式中的位置。

然而,据我所知,在GNU BREs中转义这样的字符通常是一个错误。这个正则表达式

代码语言:javascript
复制
foo\-[0-9]+

被RegexBuddy视为在其\-部件中无效。此外,RegexBuddy指出了与GNU ERE相同的错误(但不是PCRE)。另一方面,Ubuntu上的grep不会将这个正则表达式视为错误,在我的测试中它运行得很好,尽管grep默认使用的是ERE。

因此,把be和RegexBuddy放在一边,只考虑在当今许多系统和编程语言中使用的PCRE和ERE,问题是,习惯于转义每个可能的元字符以获得其字面含义可能会有多大的错误?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-02 20:44:33

我只能在这里回答PCRE的问题。在PCRE中,你可以想怎么转义就怎么转义,这不会有什么区别。引用PHP's PCRE documentation on escape sequences

...如果反斜杠后面跟着非字母数字字符,则会删除该字符可能具有的任何特殊含义。

我会把"may have“解释为”没有意义也不要紧“。我用你给出的例子进行了测试,没有问题。

一般来说,不管使用的是什么正则表达式引擎:

我想提一提,虽然为了安全而避开一切似乎是一个好主意,但你至少应该有意识地考虑一下可读性的影响。无论如何,正则表达式往往变得难以阅读,并且用不必要的反斜杠将它们弄乱并不能真正改善这一点。特别是,在字符类中,我只转义字符类中的元字符(我个人甚至更喜欢将它们移动到不需要转义的特定位置,如[a-zA-Z0-9_-],但我可以看出有些人是多么不喜欢这样)。这有一个很好的副作用。您可以使用字符类,作为(在我看来)更容易阅读的替代方案,用于转义字符,这些字符是字符类外部但不是内部的元字符。因此,您可以编写[|]而不是\|,或者编写[.]而不是\.。在单间距字体中,这个单字符字符类形成了一个很好的正方形,它很容易被识别为单个元素,并且重要字符正好位于正方形的中心(而在\.中,重要字符在“复合单个字符”中被移到右边,如果这有意义的话)。此外,如果要转义靠近未转义括号的圆括号,我发现字符类转义的可读性要好得多:(\()(\))([(])([)])。当然,这又是一个品味问题。但在为正则表达式设置转义约定时,这是值得考虑的事情。

票数 3
EN

Stack Overflow用户

发布于 2012-12-02 23:37:18

您问的不是是否可以“转义每个元字符”,而是“转义每个我不确定是否是元字符的字符”。听起来你只是想转义所有不是字母或数字的东西。

这不是功能上的错误,而是:

  • 它使得代码更难阅读。字符越少越好。
  • 它让在你之后追随你的程序员想知道为什么你不必要地转义字符,并花时间试图找出代码的不同之处,以及你试图解决的问题。
  • 当程序员最终发现你只是为了躲避非元字符字符时,她会认为你是一个不称职的程序员。--

学习你的工具,学会正确地使用它们,不要用巫术来绕过你缺乏知识的地方。

票数 2
EN

Stack Overflow用户

发布于 2012-12-02 20:45:48

我不知道POSIX正则表达式或PCRE,但在Perl中,每个带反斜杠的非单词字符都保证与其自身匹配。详情请参见perldoc -f quotemeta

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13669295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档