在正则表达式组内排除前导字符

3
我希望从一个字符串中提取一个固定长度的组,但忽略前导零。
例子:
String: 1a2300245filler060403105543a
            ^^^^^      ^^^^^^

目前的正则表达式为:.{4}(?<part_x>[\d]{5})filler(?<part_y>[\d]{6})

这样做会得到:

part_x = 00245

part_y = 060403

Is there some way to remove the leading zeroes from the grouping to get this?

part_x = 245

part_y = 60403

请注意,part_x和part_y的初始长度是固定的(分别为5和6)。我只想通过正则表达式来修剪前导零。

似乎在正则表达式内执行这个操作很困难...你可以之后再做。 - A.Joly
1个回答

3

在像这种需要选择性匹配和捕获重叠的子表达式时,可能会感到有些棘手,但是在这种特殊情况和类似情况下,你可以使用以下技巧:

.{4}(?=\d{5}(.++))0{0,4}(?<part_x>\d+(?=\1))filler(?=\d{6}(.*+))0{0,5}(?<part_y>\d+(?=\3))

这里的技巧是(?=\d{5}(.++))向前查看当前匹配点,以确保存在5个数字(正如您所要求的一样),但(.++)进一步捕获其余目标字符串以供稍后测试。然后,在捕获之外消耗潜在的前导“0” ,留下(?<part_x>\d+(?=\1))匹配其余数字,再次向前查看以验证它停止匹配数字的位置是否在早先捕获的\1之后。
然后按需填充part_x和part_y。
如果您想要概念上更容易理解的东西,您可以使用以下内容来匹配(例如)5个数字并捕获没有前导零的数字:
(?|0([1-9]\d{3})|00([1-9]\d\d)|000([1-9]\d)|0000(\d))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接