Regex-仅当存在一组单词时捕获

Regex-仅当存在一组单词时捕获,regex,Regex,例如: "Washroom L20 is broken" "LAV #L20 needs to be fixed" "R20 lavatory is broken" "Lav issue - check L20" 在只捕获L20或R20之前,我想检查句子中是否存在洗手间、厕所、Lav。有什么建议吗 我能够抓住前两个,但在剩下的时间里我一直在努力 我尝试的是: (?:(?:(?:LAV?)|(?:LAVATORY?)|(?:WASHROOM?))(?:\s*?))(?:(?:['#@:+-]?\

例如:

"Washroom L20 is broken"
"LAV #L20 needs to be fixed"
"R20 lavatory is broken"
"Lav issue - check L20"
在只捕获L20或R20之前,我想检查句子中是否存在洗手间、厕所、Lav。有什么建议吗

我能够抓住前两个,但在剩下的时间里我一直在努力

我尝试的是:

(?:(?:(?:LAV?)|(?:LAVATORY?)|(?:WASHROOM?))(?:\s*?))(?:(?:['#@:+-]?\s?)(\b[LR]\d{1,2}\b))

提前感谢您的帮助

这取决于您的引擎是否支持查找后断言。 如果是这样的话,这应该是可行的:

使用空白边界
?im^?=.*:lav|盥洗室。*?一种不让人望而却步的可能方式:

(?:washroom|lav(?:atory)?).*?([lr]20)|([lr]20).*?(?:washroom|lav(?:atory)?)
使用PHP正则表达式,因此根据您的引擎可能会有一些差异。 它基本上是按任意顺序查找两个组件中的任何一个,它们之间有任何字符

使用此选项可实时检查并可视化您的正则表达式。这很有帮助。
 (?im)
 ^
 (?=
      .* 
      (?: lav | washroom )
 )
 .*
 ['#@:+-]? [^\S\r\n]?
 \b
 ( [lr] \d{1,2} )              # (1)
 \b
(?:washroom|lav(?:atory)?).*?([lr]20)|([lr]20).*?(?:washroom|lav(?:atory)?)