正则表达式匹配重复子模式

4
我可以帮您进行翻译。该文本要求使用正则表达式匹配一个仅由重复子模式组成的模式。可以简化为以下内容。给定如下文本:
a a
a b
b b

我希望有一个正则表达式模式,只匹配"a a"和"b b"(不匹配"a b"),因为这两行中有相同子模式的两个实例。
我在BBEdit上工作,但解决方案应该适用于任何扩展的正则表达式。我一直在这里和其他地方阅读关于条件子模式的很多内容,并且试验了一些,但好像无法让它起作用。当我发现答案是多么简单时,可能会感到惭愧。如果能解释为什么正则表达式的工作原理,额外加分。
3个回答

6

你的示例数据表明你需要使用反向引用,例如:

(.) \1

说明:

  • Backreferences allow you to refer back to what was previously matched by a capturing group.

  • A backreference is specified in the regular expression as a backslash (\) followed by a number indicating the number of the capturing group to be recalled.

    (         # group and capture to \1:
      .       #   any character except \n
    )         # end of \1
              # ' '
    \1        # what was matched by capture \1
    

Live Demo


这是一个漂亮、优雅简洁的解决方案。我希望我没有把事情搞得太复杂,而实际上确实如此。我知道回溯引用,因为我使用它们进行替换,但一直试图将它们与条件模式结合起来,现在我看到这里根本不需要。谢谢! - larryy

4
你可以尝试这个正则表达式:
(?:(.) \1)

或者

(.) \1

演示

它会捕获第一个字符并将其与空格旁边的字符进行比较。这是通过反向引用完成的。

说明:(?:(.) \1)

  • (?:...) 这是称为非捕获组的内容。

  • (.) 捕获第一个字符并将其存储到一个组中。

  • 匹配空格。

  • \1 使用此字符检查第一个捕获的组。如果两者相同,则匹配整个内容。

说明:(.) \1

  • 相同,但没有非捕获组。

(.) \1就足够了,不需要周围的分组。 - nneonneo
谢谢,这个回答很好,解释得很清楚。我接受了hwnd的帖子作为答案,因为它不仅如此,而且保持简单。 - larryy

1
我不确定BBedit中的语法,但这样的代码是否可行?
/(.+) \1/

这假设你想要空格之间的空白。这告诉正则表达式捕获一些字符组并在空格后匹配相同的组。
如果您在BBedit中没有捕获组,则无法执行您要求的操作,因为这些类型的字符串位于由正则语言产生的字符串集之外。 http://en.m.wikipedia.org/wiki/Regular_language 允许反向引用的正则表达式引擎实际上会生成非确定有限状态自动机,从而使您可以匹配超集的正则语言字符串。

另一个好答案,从技术上讲,由于“+”,这更具一般性,但hwnd的答案已经足够满足需求。谢谢。 - larryy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接