【问题标题】:Limit number of character of capturing group限制捕获组的字符数
【发布时间】:2018-10-10 21:29:44
【问题描述】:

假设我有这个文本:"AAAA1 AAA11 AA111AA A1111 AAAAA AAAA1111"

我想找到符合这 3 个条件的所有匹配项:
-大写字母 1 到 4 次
- 数字 1 到 4 次
- 最大字符数为 5

所以匹配将是:
{"AAAA1", "AAA11", "AA111", "A1111", "AAAA1"}

我试过了

([A-Z]{1,4}[0-9]{1,4}){5}

但我知道它会失败,因为它正在寻找我的小组的五次。

有没有办法将组的结果限制为 5 个字符?

谢谢

【问题讨论】:

    标签: regex


    【解决方案1】:

    在检查匹配部分的模式时,您可以通过前瞻来限制字符数。

    如果你可以用空格分割输入,你可以使用:

    ^(?=.{2,5}$)[A-Z]{1,4}[0-9]{1,4}$
    

    demo here

    如果您不能按空格拆分,您可以使用捕获组和(?:^| )(?=.{2,5}(?=$| ))([A-Z]{1,4}[0-9]{1,4})(?=$| ),或lookbehind 或\K 根据您的正则表达式风格进行拆分(请参阅demo)。


    PREVIOUS ANSWER,错误匹配A1A1A,在@a_guest 备注后更新。

    您可以使用前瞻来检查您的模式,同时使用正则表达式的匹配部分限制字符数:

    (?=[A-Z]{1,4}[0-9]{1,4}).{2,5}
    

    demo here

    【讨论】:

    • 这也匹配例如A1A1A(因为前瞻距离小于匹配距离),根据OP(考虑示例+描述)这似乎是不希望的。相反,正则表达式似乎应该匹配一个字母序列后跟和一个数字序列(但不混合),每个序列的长度为1-4,并且整体组合最大。长度5.
    • 感谢@a_guest,我更新了答案以反映这一点。
    • 感谢指正。它有效!
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2015-07-16
    • 2020-10-20
    • 2014-08-04
    • 1970-01-01
    相关资源
    最近更新 更多