正则表达式匹配第二次出现。我需要它来匹配第一次出现

时间:2017-10-26 01:13:54

标签: regex

这是我的正则表达式代码:

.*(X.*)\s(.*?)\$

这是我的数据字符串:

1247.P1.06.Z01.0020N.X396X111.Y008 1247.P1.06.Z01.0020N$M234477$

这是正确抓取以第一个$符号结尾的第二个项目:

1247.P1.06.Z01.0020N

但对于第一个字符串,我希望它抓住:

X396X111.Y008
相反,它抓住了:

X111.Y008

所以我想让它获得第一个X以及一切到空间。但是第二个X正在触发匹配。

以“X”开头的字符串总是13个字符,所以我尝试指定长度,但它仍然以第二个X开始

我对这两种模式都很好:

  • 从第一个X开始,以空格结束。
  • 从第一个X开始,抓取13个字符。

谢谢。

2 个答案:

答案 0 :(得分:2)

在正则表达式的开头摆脱.*。它是贪婪的,所以它跳过了最长的前缀,允许正则表达式的其余部分匹配。这会强制其余部分取代最后一次而不是第一次出现。

DEMO

通常,没有必要将.*放在正则表达式的结尾。它只是在输入中的任何地方查找模式,因此匹配的内容将被忽略。

答案 1 :(得分:1)

你的比赛太松了。更严格的正则表达式可能是:

X\S+\s

匹配X,然后匹配每个非空格字符,直到空白字符。

演示:https://regex101.com/r/Jl2BJS/2/

如果ID始终为13个字符,则可以执行以下操作:

X.{13}

演示:https://regex101.com/r/Jl2BJS/3/

或者删除.*,或者使用?U修饰符进行非贪婪也可以。

演示:https://regex101.com/r/Jl2BJS/4/https://regex101.com/r/Jl2BJS/5/