正则表达式中第二个捕获组的一部分

时间:2019-07-24 09:43:35

标签: regex

如何确定第二个捕获组的第一部分(在点之前)?

Ik有这样的字符串:aabb_cc.dd_eeff 要将字符串分成几组,我使用正则表达式(.*)_(.*)_(.*) 我现在只使用第二组(cc.dd)点(cc)之前的部分吗?点是可选的。我该怎么做?

我尝试不成功:(.*)_(.*(?=\.))_(.*)

结果必须是:

Group 1 : aabb
Group 2 : cc
Group 3 : eeff

4 个答案:

答案 0 :(得分:1)

编辑:

由于.是可选的,因此请使用:

(.*)_(.*?)(?:\..*)?_(.*) /g

Demo


使用此:

(.*)_(.*)\..*_(.*)

只需捕获所需内容即可。

Demo

答案 1 :(得分:1)

您尝试的模式不匹配,因为.*(?=\.)这部分将匹配,直到查看最后一个点为止。

如果要完全匹配,还必须匹配点本身并匹配点之后的内容。

(.*)_(.*(?=\.))\.[^_]+_(.*)

Regex demo

您可以使用否定的字符类来优化模式,以捕获匹配项而不是点或下划线。您可以将.*更改为使用否定的字符类[^_]+,以防止不必要的回溯。

已更新以说明可选点:

([^_\s]+)_([^._\s]+)(?:\.[^._\s]+)?_([^_\s]+)

Regex demo

答案 2 :(得分:0)

更改正则表达式以使用惰性量词?,然后先匹配所有字符,先匹配.,然后再匹配更多字符。请注意,最后一组中缺少?,因为您希望非必须地匹配所有字符。

(.*?)_(.*?)\..*?_(.*)

答案 3 :(得分:0)

您可以使用此正则表达式:

(.*?)_(.*?)\..*?_(.*)

请注意第二对括号是什么,而没有。我用一个懒惰的*?找到了第一个.,将所有元素都放在了组中,然后在组外,将其余的匹配到_

Demo

相关问题