【问题标题】:Understanding Regular expression [duplicate]了解正则表达式 [重复]
【发布时间】:2019-03-07 08:06:26
【问题描述】:

我有两个难以理解的正则表达式。以下是我认为正确的两个表达式。我不确定这些表达式是 RE 还是 ERE。

^\([a-z]\)\1

在行首搜索从 a 到 z 的任何小写字母并匹配一次。

^.*\([a-z]*\).*\1.*\1

在行首搜索任意单个字符,后跟零个或多个小写字母 a 到 z,后跟任意单个字符,然后再后跟任意两个附加“任意”字符或无字符

【问题讨论】:

    标签: regex linux bash vim vi


    【解决方案1】:

    ^\([a-z])\1

    • ^ 匹配输入的开头
    • (...) 捕捉里面的一切
    • [a-z] 此字符类匹配 a-z 中的任何(小写)字符
    • \1 反向引用第一个捕获组

    捕获组(...) 中的第一个( 被转义,第二个没有,所以这个正则表达式在语法上不正确。

    ^.*\([a-z]*\).*\1.*\1

    • ^.* 匹配输入开头的所有内容
    • [a-z]* 匹配 0..* 来自 a-z 的小写字符
    • .* 匹配一切
    • \1 反向引用第一个捕获组(任意数量的小写字母)

    两个cmets:

    1. 在这里,() 都被很好地转义了
    2. 这基本上匹配以下三倍,因此没有多大意义:
      • 一切
      • 任意数量的小写字符

    要详细了解为什么它没有多大意义,我建议阅读有关正则表达式中的贪婪。

    【讨论】:

    • \1 在 Vim 中被支持,至少在我的版本中是这样
    • @JGNI 你的版本是什么?在我的 vim 8.0 中使用 / 搜索似乎不支持反向引用。
    • 我的版本是 8.0.707 测试数据是 bbdf 与正则表达式 /^\([a-z]\)\1 它匹配 bb。请注意,vim 使用 V5 正则表达式而不是 Perl 样式,因此您必须转义 () 即写入 \(\) 以创建捕获缓冲区
    • 我的立场是正确的 :-) 我的缓冲区中没有正确的数据。
    【解决方案2】:

    您的第一个正则表达式无效,因为它具有不匹配的 \( 假设您的意思是 ^\([a-z]\)\1 您有以下内容

    ^ Match at start of line
    \([a-z]\) Match a lower case letter and put it into capture buffer 1
    \1 Match what is in capture buffer 1
    

    更简单地匹配以相同的两个小写字符开头的任何行

    对于^.*\([a-z]*\).*\1.*\1

    ^ Match at start of line
    .* Match 0 or more characters
    \([a-z]*\) Match a lower case letter 0 or more times and place in capture buffer 1
    .* Match 0 or more characters
    \1 Match what is in capture buffer 1
    .* Match 0 or more characters
    \1 Match what is in capture buffer 1
    

    我怀疑这是在尝试匹配包含任何小写字母序列三次或更多次的行。但是,它写得不好,并且会匹配任何行,因为\([a-z]*\) 可以匹配一个空字符串,如果该行在第一个字符之前,则该空字符串与正则表达式的其余部分可以匹配整个正则表达式。要解决此问题,您需要将 \([a-z]*\) 更改为 \([a-z][a-z]*\)。 IE。确保至少捕获一个小写字母。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 2019-10-11
      相关资源
      最近更新 更多