首页 > 解决方案 > 在java中的正则表达式上重复相同的模式?

问题描述

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

给定以下测试集:

(hola,false);
comosoy12,true);
caminare)
true,comoestas

我使用了以下正则表达式^\(.*,(true|false)[)][;$]并得到了我的预期结果true, false, false, false快速检查here)。但是对于以下情况,我似乎无法想出正则表达式:

(someName,true), (anything,false), (pepe12,true);
(hola,false);
comosoy12,true);
(batman,true), (kittycat,false);
(batman,true); (kittycat,false);

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

标签: javaregex

解决方案


您可以使用

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

请参阅正则表达式演示。注意.*,当您想匹配字母和数字时,您的模式可以匹配除换行符以外的任何 0+ 字符,因此我建议\w(注意它也匹配_),或者,您可以使用\p{Alnum}or [A-Za-z0-9]

图案细节

  • ^- 字符串的开始
  • \(\w+,(?:true|false)\)- block: (, 1+ 字字符(或字母数字,如果您使用[a-zA-Z0-9]or \p{Alnum}),,,truefalse
  • (?:,\s*\(\w+,(?:true|false)\))*- 0个或多个序列
    • ,- 逗号
    • \s*- 0+ 个空格
    • \(\w+,(?:true|false)\)-block图案
  • ;- 一个;字符
  • $- 字符串结束

在 Java 中,您可以动态构建正则表达式,并且由于您想要与 的完整字符串匹配matches,您可以丢弃初始^和最终$锚点:

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

推荐阅读