32

这是一个示例字符串:

123456#p654321

目前,我正在使用此匹配来捕获123456654321进入两个不同的组:

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

但有时,#p654321字符串的一部分不存在,所以我只想捕获第一组。我试图通过附加到第二组来使第二组“可选” ?,这有效,但前提是#p在剩余字符串的末尾有 a 。

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

4

2 回答 2

55

您拥有#p捕获组的外部,这使其成为结果的必需部分。您还.错误地使用了点字符 ( )。点(在大多数 reg-ex 变体中)将匹配任何字符。将其更改为:

([0-9]*)(?:#p([0-9]*))?

(?:)语法是如何获得非捕获组。然后,我们只捕获您感兴趣的数字。最后,我们使整个事情成为可选的。

此外,大多数 reg-ex 变体都有一个\d数字字符类。所以你可以进一步简化:

(\d*)(?:#p(\d*))?

正如另一个人指出的那样,*操作员可能会匹配位数字。为防止这种情况,请改用+运算符:

(\d+)(?:#p(\d+))?
于 2012-09-17T00:05:05.303 回答
6

您的正则表达式实际上不会匹配任何数字,因为您使用*的是+.
这就是(我认为)你想要的:

(\d+)(?:#p(\d+))?
于 2012-09-17T00:17:54.503 回答