如何确定第二个捕获组的第一部分(在点之前)?
Ik有这样的字符串:aabb_cc.dd_eeff
要将字符串分成几组,我使用正则表达式(.*)_(.*)_(.*)
我现在只使用第二组(cc.dd)点(cc)之前的部分吗?点是可选的。我该怎么做?
我尝试不成功:(.*)_(.*(?=\.))_(.*)
结果必须是:
Group 1 : aabb
Group 2 : cc
Group 3 : eeff
答案 0 :(得分:1)
答案 1 :(得分:1)
您尝试的模式不匹配,因为.*(?=\.)
这部分将匹配,直到查看最后一个点为止。
如果要完全匹配,还必须匹配点本身并匹配点之后的内容。
(.*)_(.*(?=\.))\.[^_]+_(.*)
您可以使用否定的字符类来优化模式,以捕获匹配项而不是点或下划线。您可以将.*
更改为使用否定的字符类[^_]+
,以防止不必要的回溯。
已更新以说明可选点:
([^_\s]+)_([^._\s]+)(?:\.[^._\s]+)?_([^_\s]+)
答案 2 :(得分:0)
更改正则表达式以使用惰性量词?
,然后先匹配所有字符,先匹配.
,然后再匹配更多字符。请注意,最后一组中缺少?
,因为您希望非必须地匹配所有字符。
(.*?)_(.*?)\..*?_(.*)
答案 3 :(得分:0)
您可以使用此正则表达式:
(.*?)_(.*?)\..*?_(.*)
请注意第二对括号是什么,而没有。我用一个懒惰的*?
找到了第一个.
,将所有元素都放在了组中,然后在组外,将其余的匹配到_
。