有没有办法匹配基于先前捕获组的Regex,以前未捕获?

时间:2016-07-15 14:55:50

标签: regex

好的,所以任务是有一个字符串可以看起来像post,或post put,甚至get put post。所有这些必须匹配。最好不要匹配[space]postget[space]等偏差。

目前我想出了这个

^(post|put|delete|get)(( )(post|put|delete|get))*$

但是我对它不满意,因为我必须指定(post|put|delete|get)两次。它还匹配post post等重复项。

我想以某种方式对第一组使用反向引用(?),这样我就不必两次指定相同的条件。

然而,反向引用\1会帮助我匹配post post,例如,这与我想要的相反。我想匹配先前在字符串中找到的 NOT 的第一个捕获组中的单词。

这甚至可能吗?我一直在寻找SO问题,但是我的谷歌正在逃避我。

1 个答案:

答案 0 :(得分:4)

如果您使用的是基于PCRE的正则表达式引擎,则可以使用subroutine calls之类的(?n)来递归子模式。

^(post|put|delete|get)( (?!\1)(?1))*$
                              ^^^^

请参阅regex demo

表达式详细信息

  • ^ - 字符串开头
  • (post|put|delete|get) - 第1组匹配其中一个备选项作为文字子字符串
  • ( (?!\1)(?1))* - 零个或多个序列:
  • $ - 字符串结尾

更新

为了避免匹配get post post之类的字符串,您还需要在组1中添加否定前瞻,以便子例程调用知道我们不想匹配相同的字符串捕获到第1组的值。

^((post|put|delete|get)(?!.*\2))( (?1))*$

请参阅regex demo

不同之处在于我们将更改捕获到组2 并添加否定前瞻(?!.*\2)以禁止我们在字符串中进一步捕获的单词出现。 ( (?1))*保持不变:现在,子程序使用前瞻计算整个Capture Group 1子模式。