我的输入是
String t1 = "test1:testVar('varName', 'ns2:test')";
String t2 = "test2:testVar('varName', 'ns2:test', 'defValue')";
String patternString = "\('.*',\s*('.*:.*').*\)";
我尝试仅捕获第二对''之间的文本,即:ns2:test 我的模式是:('。',\ s ('。:。')。*)并且对于第一个字符串它是可以的,但是对于第二个我得到的结果:'ns2:test','defValue'
答案 0 :(得分:1)
你需要让模式的所有部分都变得懒惰:
\('.*?',\s*('.*?:.*?').*?\)
^^^ ^^^ ^^^ ^^^
请参阅regex 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)