2015-11-27 25 views
1

我想写一个符合这些条件的正则表达式正则表达式:一个必填词,两个选项

FIRST是必需的;它只能出现一次

这个词SECOND可以出现零或

字三分之一可以出现零次或一次

我想这

^(?=.*?(FIRST))(?=.*?(SECOND))(?=.*?(THIRD)) 

一次
^(?=.*?(FIRST))(?=.*?(SECOND{0,1}))(?=.*?(THIRD{0,1})) 

但它不起作用。有任何想法吗 ?编号: 单词可以按任意顺序排列。

这应该匹配:

这里是第一和第三

第二和第一,第三!

第三

这不应该:

一秒一秒FIRST //第二次出现两次

第二,第三//首先是强制性

+0

你能举一个例子,它不工作? – Mikey

+0

看着你的表情,你似乎有更多的条件,你不会告诉我们。这些话是否必须在特定的范围内?另外,为什么你用一个字符串的起始位置来声明位置?然后可以选择跳过任何字符直到单词FIRST? – Sascha

+0

我可能会误解你,但这不仅仅是'^ FIRST(SECOND)?(THIRD)?$'问号'?'是'{0,1}'的简写。当你说你“不起作用”时,更具体一些。 _哪个输入被错误分类? – MSalters

回答

3

您可以申请反向逻辑:FIRST,SECOND和THIRD不能出现2次或更多次,但必须至少有一次ËFIRST:

^(?!.*THIRD.*THIRD)(?!.*SECOND.*SECOND)(?!.*FIRST.*FIRST)(?=.*FIRST) 

this demo

要匹配整个单词,用单词\b边界附近的话。如果您需要匹配换行符号,请不要忘记DOTALL /单行修饰符(在大多数正则表达式中,它是/s)。

如果首先应该来到前一秒,二要来第三前,用两个多向前看符号:

^(?!.*THIRD.*(?:SECOND|FIRST)) # SECOND or FIRST cannot appear after THIRD 
(?!.*SECOND.*FIRST)   # SECOND cannot appear before FIRST 
(?!.*THIRD.*THIRD)    # THIRD can only appear one or zero times 
(?!.*SECOND.*SECOND)   # SECOND can only appear one or zero times 
(?!.*FIRST.*FIRST)   # FIRST can only appear one or zero times 
(?=.*FIRST)     # However, FIRST must appear at least once 

another demo

+0

你会如此友善地展示如何为此添加排序吗?即“FIRST”先来,然后是“SECOND”,然后是“THIRD”? –

+1

我已经更新了答案。请注意,FIRST(只出现一次)可以用两个温和的贪婪标记进行检查(请参阅[本演示](https://regex101.com/r/zO5jS2/3)),但我认为2个独立的lookahead更具可读性。 –

+0

当我看到这个时,我认为“这么简单”,但当我试图解决它时,我不能这样做。这可能是掌握正则表达式的第二阶段。感谢您的答复。 –

相关问题