正则表达式:一个必填字,两个选项

时间:2015-11-27 11:57:40

标签: regex lookahead

我试图写一个符合这些标准的正则表达式

FIRST一词是强制性的;它只能出现一次

单词SECOND可以显示为零或一次

单词THIRD可以显示为零或一次

我试过这个

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

这个

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

但它不起作用。有什么想法吗?

编辑: 这些词可以是任何顺序。

这应该匹配:

  

这是FIRST和THIRD

     

第二和第一,第三!

     

THIRD

这不应该:

  

第二个第二个//第二个出现两次

     

第二个//首先是强制性的

1 个答案:

答案 0 :(得分:3)

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

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

请参阅this demo

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

如果FIRST应该在SECOND之前出现,而SECOND应该在第三次出现之前,请再使用两个前瞻:

^(?!.*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