在Java中的正则表达式上重复相同的模式?

Mel*_*Mel 7 java regex

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

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

给定以下测试集:

(hola,false);
comosoy12,true);
caminare)
true,comoestas
Run Code Online (Sandbox Code Playgroud)

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

(someName,true), (anything,false), (pepe12,true);
(hola,false);
comosoy12,true);
(batman,true), (kittycat,false);
(batman,true); (kittycat,false);
Run Code Online (Sandbox Code Playgroud)

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

Wik*_*żew 8

您可以使用

^\(\w+,(?:true|false)\)(?:,\s*\(\w+,(?:true|false)\))*;$
Run Code Online (Sandbox Code Playgroud)

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

图案细节

  • ^ -字符串开始
  • \(\w+,(?:true|false)\)- block(,1个+字字符(或alhphanumeric如果使用[a-zA-Z0-9]\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);
Run Code Online (Sandbox Code Playgroud)

在线观看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());
Run Code Online (Sandbox Code Playgroud)

输出:

(someName,true), (anything,false), (pepe12,true); => true
(hola,false); => true
comosoy12,true); => false
(batman,true), (kittycat,false); => true
(batman,true); (kittycat,false); => false
Run Code Online (Sandbox Code Playgroud)

  • @Mel`\ w`匹配下划线。要允许`-`,请使用`[\ w-] +`代替`\ w +`。 (3认同)