匹配2个相似短语的正则表达式



我正在尝试匹配自动评分学生对一个问题的答案,其中正确答案是:

read and execute for owner and read for everyone

答案的顺序不重要,所以

read for everyone and read and execute for owner

是可以接受的答案。然后所有的不重要的(and, for)都不重要了所以我真的只是在寻找这些

中的任何一个
read execute owner read everyone
read everyone read execute owner

我可以得到一个正则表达式来接受答案

(?=.*read.*execute.*owner)(?=.*read.*everyone)

但很明显,它接受了更多明显错误的答案,比如"read execute owner read execute everyone"。所以我试着对每个人使用"执行"的负面前瞻性,但它仍然匹配"执行"的所有者,并说没有regex匹配。

有办法完成我想做的事吗?谢谢。

让and/for可选。

 # (?=.*(bread(?:s+and)?s+execute(?:s+for)?s+ownerb))(?=.*(bread(?:s+for)?s+everyoneb))
 (?=
      .* 
      (                             # (1 start)
           b read               
           (?: s+ and )?
           s+ execute 
           (?: s+ for )?
           s+ 
           owner b 
      )                             # (1 end)
 )
 (?=
      .*           
      (                             # (2 start)
           b read                
           (?: s+ for )?
           s+ everyone b 
      )                             # (2 end)
 )

编辑:您还可以允许在
之间任意字。通过从关键字之间排除所有关键字。
像这样-

 #  (?=.*(bread(?:s+(?:(?!b(?:read|execute|owner|everyone)b).)+?)?s+execute(?:s+(?:(?!b(?:read|execute|owner|everyone)b).)+?)?s+ownerb))(?=.*(bread(?:s+(?:(?!b(?:read|everyone|execute|owner)b).)+?)?s+everyoneb))
 (?=
      .* 
      (                     # (1 start)
           b read
           (?:
                # Optional words Between Keywords -
                # not any of this or the other ones keywords
                s+ 
                (?:
                     (?!
                          b 
                          (?:
                               read                  # this
                            |  execute               # this
                            |  owner                 # this
                            |  everyone              # other
                          )
                          b 
                     )
                     . 
                )+?
           )?
           s+ execute
           (?:
                # Optional words Between Keywords
                s+ 
                (?:
                     (?!
                          b 
                          (?:
                               read
                            |  execute
                            |  owner
                            |  everyone
                          )
                          b 
                     )
                     . 
                )+?
           )?
           s+ 
           owner b 
      )                     # (1 end)
 )
 (?=
      .* 
      (                     # (2 start)
           b read
           (?:
                # Optional words Between Keywords -
                # not any of this or the other ones keywords
                s+ 
                (?:
                     (?!
                          b 
                          (?:
                               read                  # this
                            |  everyone              # this
                            |  execute               # other
                            |  owner                 # other
                          )
                          b 
                     )
                     . 
                )+?
           )?
           s+ everyone b 
      )                     # (2 end)
 )

最新更新