8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何使正则表达式匹配的一部分成为可选的?

Mohamed Gharib 2月前

28 0

这是一个示例字符串:123456#p654321 目前,我使用此匹配将 123456 和 654321 捕获到两个不同的组中:([0-9].*)#p([0-9].*) 但有时,#p654321 部分

这是一个示例字符串:

123456#p654321

目前,我正在使用此匹配来捕获 123456 654321 分成两个不同的组:

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

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

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

帖子版权声明 1、本帖标题:如何使正则表达式匹配的一部分成为可选的?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Mohamed Gharib在本站《regex》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您有 #p 捕获组的外部,这使它成为结果的必需部分。您还 . 错误地使用了点字符 ( )。点(在大多数正则表达式变体中)将匹配任何字符。将其更改为:

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

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

    此外,大多数正则表达式变体都有 \d 数字字符类。因此,您可以进一步简化:

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

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

    (\d+)(?:#p(\d+))?
    
  • 我之前尝试过,它可以工作,但是如果字符串有第二部分,则第一组是整个字符串,而第二组中没有任何内容。

  • 我认为应该提到,可选组后面的捕获组将保留其引用,即使可选组不存在也是如此(例如 \2 将为空,而虚构的第三个捕获组仍将被引用为 \3,而不是 \2)。如果有人想知道的话。

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

    (\d+)(?:#p(\d+))?
    
  • 您说得对;使用 + 运算符会更好。我考虑过做这个改动,但原作者没有说明是否有可能出现无数字的情况。因此,我尽量让它尽可能接近他的原文。

返回
作者最近主题: