匹配正则表达式中的重复子串

Wha*_*sit 25 regex

正则表达式是否可以根据相同正则表达式的其他部分进行匹配?

例如,我如何匹配以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回指任何由第一捕获组的内容(的内容相匹配()).大多数语言的正则表达式允许这样的东西.

  • 嗯,我实际上在find/replace的替换部分中使用捕获组和反向引用多年.我从来没有想过我也可以在原始的比赛模式中使用它们. (4认同)

Mic*_*ers 16

你需要反向引用.我们的想法是在第一位使用捕获组,然后在尝试匹配最后一位时再参考它.这是一个匹配一对HTML开始和结束标记的示例(来自前面给出的链接):

<([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>
Run Code Online (Sandbox Code Playgroud)

此正则表达式只包含一对括号,它们将匹配的字符串捕获[A-Z][A-Z0-9]*到第一个反向引用中.这个反向引用重用\1(反斜杠一).在/那简直就是我们试图匹配收盘HTML标记斜杠前.

将此应用于您的案例:

/^(.{3}).*\1$/
Run Code Online (Sandbox Code Playgroud)

(是的,这是Brian Carper发布的正则表达式.没有那么多方法可以做到这一点.)

后人的详细解释(如果它在你的下方,请不要被侮辱):

  • ^ 匹配行的开头.
  • (.{3}) 抓取任意类型的三个字符并将其保存在一个组中供以后参考.
  • .*尽可能地匹配任何东西.(你不在乎中间的是什么.)
  • \1 匹配在步骤2中捕获的组.
  • $ 匹配行的结尾.