【发布时间】:2019-03-07 08:06:26
【问题描述】:
我有两个难以理解的正则表达式。以下是我认为正确的两个表达式。我不确定这些表达式是 RE 还是 ERE。
^\([a-z]\)\1
在行首搜索从 a 到 z 的任何小写字母并匹配一次。
^.*\([a-z]*\).*\1.*\1
在行首搜索任意单个字符,后跟零个或多个小写字母 a 到 z,后跟任意单个字符,然后再后跟任意两个附加“任意”字符或无字符
【问题讨论】:
我有两个难以理解的正则表达式。以下是我认为正确的两个表达式。我不确定这些表达式是 RE 还是 ERE。
^\([a-z]\)\1
在行首搜索从 a 到 z 的任何小写字母并匹配一次。
^.*\([a-z]*\).*\1.*\1
在行首搜索任意单个字符,后跟零个或多个小写字母 a 到 z,后跟任意单个字符,然后再后跟任意两个附加“任意”字符或无字符
【问题讨论】:
^\([a-z])\1
^ 匹配输入的开头(...) 捕捉里面的一切[a-z] 此字符类匹配 a-z 中的任何(小写)字符\1 反向引用第一个捕获组捕获组(...) 中的第一个( 被转义,第二个没有,所以这个正则表达式在语法上不正确。
^.*\([a-z]*\).*\1.*\1
^.* 匹配输入开头的所有内容[a-z]* 匹配 0..* 来自 a-z 的小写字符.* 匹配一切\1 反向引用第一个捕获组(任意数量的小写字母)两个cmets:
( 和 ) 都被很好地转义了要详细了解为什么它没有多大意义,我建议阅读有关正则表达式中的贪婪。
【讨论】:
\1 在 Vim 中被支持,至少在我的版本中是这样
/ 搜索似乎不支持反向引用。
bbdf 与正则表达式 /^\([a-z]\)\1 它匹配 bb。请注意,vim 使用 V5 正则表达式而不是 Perl 样式,因此您必须转义 () 即写入 \(\) 以创建捕获缓冲区
您的第一个正则表达式无效,因为它具有不匹配的 \( 假设您的意思是 ^\([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。确保至少捕获一个小写字母。
【讨论】: