我有一个可能具有以下两种格式之一的字符串:

  • (someName,true);(其中someName可以是字母和数字的任意组合,并且在逗号后我们可以使用truefalse)
  • (someName,true), (anything,false), (pepe12,true);,在这种情况下,我们可以有尽可能多的括号组,但是它们之间用逗号和空格隔开。

  • 给定以下测试集:
    (hola,false);
    comosoy12,true);
    caminare)
    true,comoestas
    

    我使用以下正则表达式^\(.*,(true|false)[)][;$]并获得了true, false, false, false(quick check here)的预期结果。但是在以下情况下,我似乎无法提出正则表达式:
    (someName,true), (anything,false), (pepe12,true);
    (hola,false);
    comosoy12,true);
    (batman,true), (kittycat,false);
    (batman,true); (kittycat,false);
    

    哪个应该返回true, true, false, true, false

    最佳答案

    您可以使用

    ^\(\w+,(?:true|false)\)(?:,\s*\(\w+,(?:true|false)\))*;$
    

    参见regex demo。请注意,您的模式中的.*可以匹配除换行符以外的任何0+字符,而您想匹配字母和数字,因此,我建议使用\w(请注意,它也匹配_),或者,您可以使用\p{Alnum}[A-Za-z0-9]

    模式详细信息
  • ^-字符串
  • 的开始
  • \(\w+,(?:true|false)\)-block:(,1个以上的字符字符(如果使用[a-zA-Z0-9]\p{Alnum}则为字母数字),,truefalse
  • (?:,\s*\(\w+,(?:true|false)\))*-0个或多个序列
  • ,-逗号
  • \s*-0+空格
  • \(\w+,(?:true|false)\)-block模式
  • ;-一个; char
  • $-字符串
  • 的结尾

    在Java中,您可以动态构建正则表达式,并且由于您希望与matches进行完整的字符串匹配,因此可以丢弃初始^和最终$ anchor :
    String block = "\\(\\w+,(?:true|false)\\)";
    String regex = block + "(?:,\\s+" + block + ")*;";
    bool result = s.matches(regex);
    

    在线观看Java演示:
    List<String> strs = Arrays.asList("(someName,true), (anything,false), (pepe12,true);","(hola,false);","comosoy12,true);", "(batman,true), (kittycat,false);", "(batman,true); (kittycat,false);");
    String block = "\\(\\w+,(?:true|false)\\)";
    String regex = block + "(?:,\\s+" + block + ")*;";
    Pattern p = Pattern.compile(regex);
    for (String str : strs)
        System.out.println(str + " => " + p.matcher(str).matches());
    

    输出:
    (someName,true), (anything,false), (pepe12,true); => true
    (hola,false); => true
    comosoy12,true); => false
    (batman,true), (kittycat,false); => true
    (batman,true); (kittycat,false); => false
    

    10-07 19:34
    查看更多