这是一个示例字符串:
123456#p654321
目前,我正在使用此匹配将123456
和654321
捕获到两个不同的组中:
([0-9].*)#p([0-9].*)
但有时,字符串的#p654321
部分不会出现,所以我只想捕获第一组。我试图让第二组"可选"通过附加?
来实现它,但只有在剩余字符串末尾有#p
的情况下才会有效。
解决此问题的最佳方法是什么?
答案 0 :(得分:41)
您在捕获组外部有#p
,这使其成为结果的必需部分。您还使用了不正确的点字符(.
)。 Dot(在大多数reg-ex变体中)将匹配任何角色。将其更改为:
([0-9]*)(?:#p([0-9]*))?
(?:)
语法是获取非捕获组的方法。然后我们只捕获您感兴趣的数字。最后,我们将整个事物作为可选项。
此外,大多数reg-ex变体的数字都有\d
个字符。所以你可以进一步简化:
(\d*)(?:#p(\d*))?
正如另一个人所指出的,*
运营商可能会匹配零位数。为防止出现这种情况,请改用+
运算符:
(\d+)(?:#p(\d+))?
答案 1 :(得分:5)
您的正则表达式实际上会匹配没有数字,因为您使用的是*
而不是+
。
这就是(我认为)你想要的东西:
(\d+)(?:#p(\d+))?