Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 理解正则表达式_Regex_Linux_Bash_Vim_Vi - Fatal编程技术网

Regex 理解正则表达式

Regex 理解正则表达式,regex,linux,bash,vim,vi,Regex,Linux,Bash,Vim,Vi,我有两个正则表达式,我很难理解。下面是我认为正确的两个表达。我不确定这些表达是RE还是ERE ^\([a-z]\)\1 在行的开头搜索从a到z的任何小写字母,并匹配一个匹配项 ^.*\([a-z]*\).*\1.*\1 在行首搜索任何单个字符,后跟零个或多个小写字母a到z,后跟任何单个字符,然后再后跟任何两个附加的“any”字符或无字符([a-z])\1 ^匹配输入的开始 (…)捕获内部的所有内容 [a-z]此字符类匹配a-z中的任何(小写)字符 \1返回对第一个捕获组的引用 捕获组(…

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

^\([a-z]\)\1
在行的开头搜索从a到z的任何小写字母,并匹配一个匹配项

^.*\([a-z]*\).*\1.*\1
在行首搜索任何单个字符,后跟零个或多个小写字母a到z,后跟任何单个字符,然后再后跟任何两个附加的“any”字符或无字符([a-z])\1

  • ^
    匹配输入的开始
  • (…)
    捕获内部的所有内容
  • [a-z]
    此字符类匹配a-z中的任何(小写)字符
  • \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中的0..*小写字符
  • *
    匹配所有内容
  • \1
    返回对第一个捕获组的引用(任意数量的小写字母)
两点意见:

  • 在这里,
    都得到了很好的应用
  • 这基本上与以下三项匹配,因此没有多大意义:
    • 一切
    • 任意数量的小写字符

  • 为了进一步了解为什么它没有多大意义,我建议阅读正则表达式中的greedyness。

    您的第一个正则表达式无效,因为它有一个不匹配的
    \(
    假设您的意思是
    ^\([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]*\)
    。即,确保捕获至少一个小写字母。

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