在正则表达式中查找第二次出现的模式

时间:2016-03-17 15:07:33

标签: java regex pattern-matching

我的输入是

  String t1 = "test1:testVar('varName', 'ns2:test')";
  String t2 = "test2:testVar('varName', 'ns2:test', 'defValue')";
  String patternString = "\('.*',\s*('.*:.*').*\)";

我尝试仅捕获第二对''之间的文本,即:ns2:test 我的模式是:('。',\ s ('。:。')。*)并且对于第一个字符串它是可以的,但是对于第二个我得到的结果:'ns2:test','defValue'

2 个答案:

答案 0 :(得分:1)

你需要让模式的所有部分都变得懒惰:

\('.*?',\s*('.*?:.*?').*?\)
   ^^^       ^^^ ^^^  ^^^

请参阅regex demo

Java demo

String t1 = "test1:testVar('varName', 'ns2:test')";
String t2 = "test2:testVar('varName', 'ns2:test', 'defValue')";
String patternString = "\\('.*?',\\s*('.*?:.*?').*?\\)";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(t1);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
}
matcher = pattern.matcher(t2);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 

另一种方法是使用否定的字符类,但如果您的输入比您发布的更复杂,则可能会导致问题:

\('[^',]*',\s*('[^',]*:[^',]*')

查看regex demo,其中[^',]匹配除',之外的任何字符。

答案 1 :(得分:0)

如果要捕获的字符串片段总是与给定示例类似,请尝试使用:

'\w+:\w+'

DEMO