这是我的正则表达式代码:
.*(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开始
我对这两种模式都很好:
谢谢。
答案 0 :(得分:2)
在正则表达式的开头摆脱.*
。它是贪婪的,所以它跳过了最长的前缀,允许正则表达式的其余部分匹配。这会强制其余部分取代最后一次而不是第一次出现。
通常,没有必要将.*
放在正则表达式的结尾。它只是在输入中的任何地方查找模式,因此匹配的内容将被忽略。
答案 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/