好的,所以任务是有一个字符串可以看起来像post
,或post put
,甚至get put post
。所有这些必须匹配。最好不要匹配[space]post
或get[space]
等偏差。
目前我想出了这个
^(post|put|delete|get)(( )(post|put|delete|get))*$
但是我对它不满意,因为我必须指定(post|put|delete|get)
两次。它还匹配post post
等重复项。
我想以某种方式对第一组使用反向引用(?),这样我就不必两次指定相同的条件。
然而,反向引用\1
会帮助我仅匹配post post
,例如,这与我想要的相反。我想匹配先前在字符串中找到的 NOT 的第一个捕获组中的单词。
这甚至可能吗?我一直在寻找SO问题,但是我的谷歌正在逃避我。
答案 0 :(得分:4)
如果您使用的是基于PCRE的正则表达式引擎,则可以使用subroutine calls之类的(?n)
来递归子模式。
^(post|put|delete|get)( (?!\1)(?1))*$
^^^^
请参阅regex demo
表达式详细信息:
^
- 字符串开头(post|put|delete|get)
- 第1组匹配其中一个备选项作为文字子字符串( (?!\1)(?1))*
- 零个或多个序列:
- 空格(?!\1)
- 如果由于negative lookahead \1
(?1)
- 第一个捕获组的subroutine call(即它使用与第1组相同的模式)$
- 字符串结尾为了避免匹配get post post
之类的字符串,您还需要在组1中添加否定前瞻,以便子例程调用知道我们不想匹配相同的字符串捕获到第1组的值。
^((post|put|delete|get)(?!.*\2))( (?1))*$
请参阅regex demo
不同之处在于我们将更改捕获到组2 并添加否定前瞻(?!.*\2)
以禁止我们在字符串中进一步捕获的单词出现。 ( (?1))*
保持不变:现在,子程序使用前瞻计算整个Capture Group 1子模式。