【问题标题】:Regex pattern matching with multiple strings与多个字符串匹配的正则表达式模式
【发布时间】:2021-12-08 12:14:04
【问题描述】:

原谅我。我对正则表达式模式不太熟悉。

我创建了一个如下的正则表达式模式。

String regex = Pattern.quote(value) + ", [NnoneOoff0-9\\-\\+\\/]+|[NnoneOoff0-9\\-\\+\\/]+, "
            + Pattern.quote(value);

此正则表达式模式因 2 组不同的字符串而失败。

值 = "207e/160";

用例 1 -

channelStr = "207e/160, 149/80"

然后channelStr.matches(regex),返回“真”。

用例 2 -

channelStr = "207e/160, 149/80, 11"

然后channelStr.matches(regex),返回“false”。

不知道为什么?据我所知,这可能是因为存在超过 2 个字符串并用逗号分隔时涉及多个空格。

不确定我应该为超过 2 个字符串编写什么正确模式。

任何帮助将不胜感激。

【问题讨论】:

    标签: java python-3.x regex java-8 pattern-matching


    【解决方案1】:

    如果你打印你的图案,它是:

    \Q207e/160\E, [NnoneOoff0-9\-\+\/]+|[NnoneOoff0-9\-\+\/]+, \Q207e/160\E
    

    它由一个替换 | 组成,在左侧和右侧都匹配强制逗号。

    使用matches(),应该匹配整个字符串,207e/160, 149/80就是这种情况,所以这是一个匹配。

    只有这个字符串 207e/160, 149/80, 11 有 2 个逗号,所以你确实得到了字符串第一部分的部分匹配,但你没有匹配整个字符串,所以 match() 返回 false。

    查看此regex demo 中的匹配项。


    要匹配所有值,您可以使用重复模式:

    ^[NnoeOf0-9+/-]+(?:,\h*[NnoeOf0-90+/-]+)*$
    
    • ^ 字符串开始
    • [NnoeOf0-9\\+/-]+
    • (?:非捕获组
      • ,\h* 匹配逗号和可选的水平空白字符
      • [NnoeOf0-90-9\\+/-]+ 匹配 1+ 字符类中列出的任何一个
    • )* 关闭非捕获组并可选地重复它(如果应该至少有 1 个逗号,那么量词可以是 + 而不是 *
    • $字符串结束

    Regex demo

    使用matches()的例子:

    String channelStr1 = "207e/160, 149/80";
    String channelStr2 = "207e/160, 149/80, 11";
    String regex = "^[NnoeOf0-9+/-]+(?:,\\h*[NnoeOf0-90+/-]+)*$";
            
    System.out.println(channelStr1.matches(regex));
    System.out.println(channelStr2.matches(regex));
    

    输出

    真 真的

    注意在字符类中你可以把-放在最后而不用转义,+/也不需要转义。 p>

    【讨论】:

    • 一个好的做法是尽可能不要复制(长)子表达式。首先,因为它可以更改,就像在此表达式中定义的类一样,其次,因为它使维护更加费力和精细。
    • @JGomez 在这里重复子表达式是因为它是展开模式。 Java 不支持递归子模式,否则您可以这样做。您建议的模式具有单个字符类,但重复整个表达式并使用负前瞻和量词可以在不匹配时引入更多回溯。参见例如步骤数(最终可能由 Java 内部优化)regex101.com/r/bBkUg3/1
    【解决方案2】:
    ^(?:[NnoneOoff0-9\\-\\+\\/]+ *(?:, *(?!$)|$))+$
    

    ^ 开始
    (?: ... ) 定义项目及其分隔符的非捕获组。在除最后一项之外的每一项之后,必须出现分隔符 (,)。逗号前后可以出现空格(一个、多个或无),逗号由 * 指定。该组可以在字符串末尾出现一次或多次,由组右括号后的+ 量词指定。

    Regex101 Test

    【讨论】:

      【解决方案3】:

      您可以使用regex101 来测试您的RegEx。它描述了正在帮助调试的所有内容。他们在右下角有一个快速参考部分,您可以使用它来了解您可以使用示例和内容做什么。

      有些东西,你可以用\添加文字,所以\"是文字双引号。

      如果您希望模式是某物的一个或多个,您可以使用+。这些称为量词,可以应用于组、标记等。空白字符的标记是\s。因此,一个或多个空白字符将是\s+

      很难准确说出您要做什么,但希望将您指向regex101 会有所帮助。如果您想提供当前 RegEx 的示例、您想要匹配的内容以及您用来测试它的字符串,我很乐意为您提供示例。

      【讨论】:

        猜你喜欢
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 2013-02-12
        • 1970-01-01
        相关资源
        最近更新 更多