好了,任务是,有一个字符串,可以像post
,或者post put
甚至是get put post
。所有这些都必须匹配。最好将deviances设为[space]post
,否则get[space]
不应该匹配。
目前我想到了这个
^(post|put|delete|get)(( )(post|put|delete|get))*$
但是我对此不满意,因为我不得不指定(post|put|delete|get)
两次。它还匹配类似的重复项post post
。
我想以某种方式对第一组使用向后引用(?),这样我就不必两次指定相同的条件。
然而,反向引用\1
会帮我只匹配post post
,例如,这就是我想要的正好相反。我想这是第一个捕获组中匹配一个单词不是以前在字符串中找到。
这有可能吗?我一直在寻找SO问题,但我的Google-fu却使我望而却步。
如果您使用的是基于PCRE的正则表达式引擎,则可以使用子例程调用(例如(?n)
,递归子模式)。
^(post|put|delete|get)( (?!\1)(?1))*$
^^^^
表达式细节:
^
-字符串开始(post|put|delete|get)
-组1将替代项之一作为文字子串匹配( (?!\1)(?1))*
-零个或多个序列:
$
-字符串结尾为了避免匹配字符串一样get post post
,你也需要添加一个负向前查找到第1组,使得子程序调用意识到,我们不希望以匹配被捕获到第1组相同的值。
^((post|put|delete|get)(?!.*\2))( (?1))*$
区别在于,我们捕获了到第2组中的替代项,并添加了负向超前行为,(?!.*\2)
以防止在字符串中进一步捕获到的单词出现。将( (?1))*
保持不变:现在,子程序递归整个拍摄组1子模式与前瞻。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句