正则表达式问题

时间:2018-10-02 08:01:26

标签: regex linux bash vim vi

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

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

在行的开头搜索从a到z的任何小写字母,并匹配一个匹配项。

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

在该行的开头搜索任何单个字符,后跟零个或多个小写字母a至z,然后是任何单个字符,然后是任意两个附加的“任何”字符或无字符

2 个答案:

答案 0 :(得分:2)

^\([a-z])\1

  • ^匹配输入开始
  • (...)捕获内部所有内容
  • [a-z]此字符类与a-z中的任何(小写)字符匹配
  • \1回溯到第一个捕获组

捕获组(中的第一个(...)被转义,第二个未转义,因此此正则表达式在语法上是错误的。

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

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

两条评论:

  1. 在这里()都可以很好地保存
  2. 这基本上匹配以下内容的三倍,因此没有太大意义:
    • 一切
    • 任意数量的小写字母

要了解更多有关为什么它没有多大意义的信息,建议您阅读正则表达式中的贪婪内容。

答案 1 :(得分: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]*\)。即确保您至少捕获了一个小写字母。