正则表达式是否可以根据相同正则表达式的其他部分进行匹配?
例如,我如何匹配以3个字符的相同序列开头和结尾的行,而不管字符是什么?
火柴:
abcabc
xyz abc xyz
Run Code Online (Sandbox Code Playgroud)
不匹配:
abc123
Run Code Online (Sandbox Code Playgroud)
未定义:(可以匹配与否,以最简单的方式)
ababa
a
Run Code Online (Sandbox Code Playgroud)
理想情况下,我喜欢perl正则表达式的东西.如果那是不可能的,我有兴趣知道是否有任何风味可以做到这一点.
Bri*_*per 28
使用捕获组和反向引用.
/^(.{3}).*\1$/
Run Code Online (Sandbox Code Playgroud)
所述\1回指任何由第一捕获组的内容(的内容相匹配()).大多数语言的正则表达式允许这样的东西.
Mic*_*ers 16
你需要反向引用.我们的想法是在第一位使用捕获组,然后在尝试匹配最后一位时再参考它.这是一个匹配一对HTML开始和结束标记的示例(来自前面给出的链接):
Run Code Online (Sandbox Code Playgroud)<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>此正则表达式只包含一对括号,它们将匹配的字符串捕获
[A-Z][A-Z0-9]*到第一个反向引用中.这个反向引用重用\1(反斜杠一).在/那简直就是我们试图匹配收盘HTML标记斜杠前.
将此应用于您的案例:
/^(.{3}).*\1$/
Run Code Online (Sandbox Code Playgroud)
(是的,这是Brian Carper发布的正则表达式.没有那么多方法可以做到这一点.)
后人的详细解释(如果它在你的下方,请不要被侮辱):
^ 匹配行的开头. (.{3}) 抓取任意类型的三个字符并将其保存在一个组中供以后参考..*尽可能地匹配任何东西.(你不在乎中间的是什么.)\1 匹配在步骤2中捕获的组.$ 匹配行的结尾.