【问题标题】:Aren't curly brackets the metacharacters in regular expressions in cygwin?花括号不是cygwin中正则表达式中的元字符吗?
【发布时间】:2023-08-17 09:27:01
【问题描述】:

我想在 cygwin 中使用 grep 搜索文本文件中的电话号码。 号码是0570-2770521,我用的是正则表达式 “[0-9]{4}-[0-9]{7}”,总命令为grep "[0-9]{4}-[0-9]{7}" ./list.txt,但它不起作用。 然后我改成grep "[0-9]\{4\}-[0-9]\{7\}" ./list.txt,就可以了!

但是既然{}是元字符,如果转义它们就只是文字字符,那么它们怎么能代表[0-9]的匹配次数呢?

我理解错了吗? 希望有人能帮忙解释一下这个困惑,在此先感谢!

最好的问候!

【问题讨论】:

  • 在 bre 中您需要转义 {} 而在 pcre 中您不需要转义 {} 以将它们用作 metachar

标签: regex cygwin curly-brackets


【解决方案1】:

man re_format:

过时的(“基本”)正则表达式在几个方面有所不同。 [...] 边界的分隔符是 \{\}{} 本身是普通字符。

使用egrep(或等效的grep -E)来增强您可能更熟悉的正则表达式。

【讨论】:

  • 所以,{} 是基本正则表达式中的普通字符,但似乎 [] 在基本正则表达式中有效,为什么 {} 如此特殊并且基本正则表达式中是否有任何元字符也很普通?我看了很多资料,都没有提到这个。
  • 因为最初计数修饰符不是正则表达式的一部分,所以它们是后来添加的(与字符类不同,字符类几乎永远存在)。因此,为了保持向后兼容性,他们不能突然将 {} 从普通字符提升为元字符,因为将它们用作普通字符的旧脚本会损坏。