正则表达式匹配如果存在不匹配一行

时间:2021-05-25 23:55:34

标签: regex regex-group

我有一组字符串:

  • 站点:4442.001 租金 (x 1) PU094928
  • Exchange1 x 6m Marrell - 建筑 &
  • 清空 bin1 x 240L - 商用和 PU094928

如果 Site*** 出现在开头,如果 P*** 出现在最后,我想把它匹配成 3 列 否则全部匹配

我正在努力

^(.*)??(Site\S\s\d+\S\d+)?(.*)?\s(P.*?)$

但它不见了

  • Exchange1 x 6m Marrell - 建筑 &

我该怎么做?

正则表达式:PCRE(PHP<7.3)

2 个答案:

答案 0 :(得分:2)

最后一部分,包括 \s 需要是可选的以匹配没有它的字符串

试试

^(Site\S\s\d+\S\d+)?(.*?)((\s)P.*)?$

https://regex101.com/r/SuvUDb/1

答案 1 :(得分:1)

您还可以使用可选的非捕获组来不捕获空间并使模式更加具体:

^(Site:\h\d+\.\d+)?(.+?)(?:\h(P.*))?$
  • ^ 字符串开头
  • (Site:\h\d+\.\d+)? 可选group 1,匹配Site:一个空格和数字.个数字
  • (.+?) 捕获组2,最后匹配任意字符1次或多次以不匹配空字符串
  • (?:\h(P.*))? 可选的非捕获组,匹配一个空格并捕获 P组 3
  • 中任意字符的 0+ 次
  • $ 字符串结束

Regex demo

相关问题