2

我希望正则表达式仅在包含重复子模式时才匹配模式。它可以归结为以下简单的东西。鉴于此文本:

a a
a b
b b

我想要一个只匹配“a a”和“b b”(而不是“a b”)的正则表达式模式,因为在这些行上出现了两次相同的子模式。

我在 BBEdit 工作,尽管该解决方案可能适用于任何扩展的正则表达式。我已经阅读了很多关于堆栈溢出和其他地方的条件子模式的信息,并在我进行的过程中进行了试验,但我似乎无法让它发挥作用。当我发现它是多么简单时,可能会感到懊恼。奖励积分(像往常一样)用于解释为什么正则表达式会以它的方式工作。

4

3 回答 3

5

好吧,从您的示例数据中,您想像这样使用反向引用..

(.) \1

说明

  • 反向引用允许您回溯到捕获组之前匹配的内容。

  • 反向引用在正则表达式中指定为反斜杠 ( \) 后跟一个数字,表示要调用的捕获组的编号。

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

现场演示

于 2014-06-24T01:46:26.710 回答
4

你可以试试这个正则表达式,

(?:(.) \1)

或者

(.) \1

演示

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

解释:(?:(.) \1)

  • (?:...)这称为非捕获组。

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

  • 匹配一个空格。

  • \1使用此字符检查第一个捕获的组。如果两者相同。然后它匹配整个。

解释:(.) \1

  • 没有非捕获组也一样。
于 2014-06-24T01:45:50.810 回答
1

我不确定 BBedit 中的语法,但是这样的东西会起作用吗?

/(.+) \1/

这假设您打算使用两者之间的空白。这告诉正则表达式捕获一些字符组并在空格后匹配同一组。

如果您在 BBedit 中没有捕获组,则无法执行您所要求的操作,因为这些类型的字符串超出了常规语言生成的字符串集。http://en.m.wikipedia.org/wiki/Regular_language

允许反向引用的正则表达式引擎实际上会产生不确定的有限状态自动机,它允许您匹配正则语言字符串的超集。

于 2014-06-24T01:50:23.800 回答