特定单词后正则表达式可选组匹配

时间:2017-04-13 17:33:52

标签: regex

正则表达式:

(\d+).*?((?:[a-z][a-z\s?]+)).*?((?:court|ct|street|st)).*?(UNT\s?[\d\w].*|#\s?[\d\w].*)/ig

匹配

119 testing str test court #123

119 testing stret test court # 123

119 testing strt ct UNT 123

119 testing st UNT dsff

123 testing blah ct

我当前的正则表达式正在前4个条目上正确捕获。我怎样才能使#和UNT的所有内容都可选,所以我的最终“123测试版本”也可以拥有捕获组?

1 个答案:

答案 0 :(得分:1)

您不能将结尾作为选项,如果不必,则不会匹配。
必须诱使它继续下去。

可以使用EOL锚点$完成。

请注意,此部分[a-z\s?]是一个匹配a-z或空格或问号文字的类。
不确定这是不是你的意思。

demo

(?im)(\d+).*?((?:[a-z](?:[a-z]|[^\S\r\n])+)).*?((?:court|ct|street|st)).*?((?:UNT|\#)[^\S\r\n]?\w.*)?$

解释:

 (?im)                                  # Modifiers: ignore case, multi-line

 ( \d+ )                                # (1)
 .*? 
 (                                      # (2 start)
      (?:
           [a-z] 
           (?: [a-z] | [^\S\r\n] )+
      )
 )                                      # (2 end)
 .*? 
 (                                      # (3 start)
      (?: court | ct | street | st )
 )                                      # (3 end)
 .*? 
 (                                      # (4 start)
      (?: UNT | \# )
      [^\S\r\n]? \w .* 
 )?                                     # (4 end)

 $                                      # End of line (or string)