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