这是一个示例字符串:
123456#p654321
目前,我正在使用此匹配来捕获123456
并654321
进入两个不同的组:
([0-9].*)#p([0-9].*)
但有时,#p654321
字符串的一部分不存在,所以我只想捕获第一组。我试图通过附加到第二组来使第二组“可选” ?
,这有效,但前提是#p
在剩余字符串的末尾有 a 。
解决这个问题的最佳方法是什么?
这是一个示例字符串:
123456#p654321
目前,我正在使用此匹配来捕获123456
并654321
进入两个不同的组:
([0-9].*)#p([0-9].*)
但有时,#p654321
字符串的一部分不存在,所以我只想捕获第一组。我试图通过附加到第二组来使第二组“可选” ?
,这有效,但前提是#p
在剩余字符串的末尾有 a 。
解决这个问题的最佳方法是什么?
您拥有#p
捕获组的外部,这使其成为结果的必需部分。您还.
错误地使用了点字符 ( )。点(在大多数 reg-ex 变体中)将匹配任何字符。将其更改为:
([0-9]*)(?:#p([0-9]*))?
(?:)
语法是如何获得非捕获组。然后,我们只捕获您感兴趣的数字。最后,我们使整个事情成为可选的。
此外,大多数 reg-ex 变体都有一个\d
数字字符类。所以你可以进一步简化:
(\d*)(?:#p(\d*))?
正如另一个人指出的那样,*
操作员可能会匹配零位数字。为防止这种情况,请改用+
运算符:
(\d+)(?:#p(\d+))?
您的正则表达式实际上不会匹配任何数字,因为您使用*
的是+
.
这就是(我认为)你想要的:
(\d+)(?:#p(\d+))?