如何使正则表达式匹配可选?

时间:2012-09-17 00:01:42

标签: regex

这是一个示例字符串:

123456#p654321

目前,我正在使用此匹配将123456654321捕获到两个不同的组中:

([0-9].*)#p([0-9].*)

但有时,字符串的#p654321部分不会出现,所以我只想捕获第一组。我试图让第二组"可选"通过附加?来实现它,但只有在剩余字符串末尾有#p的情况下才会有效。

解决此问题的最佳方法是什么?

2 个答案:

答案 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+))?