我有一个可能具有以下两种格式之一的字符串:
(someName,true);
(其中someName可以是字母和数字的任意组合,并且在逗号后我们可以使用true
或false
)(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}
则为字母数字),,
,true
或false
(?:,\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