我想得到text2这个词,但它返回null。你能纠正一下吗?
String str = "Text SETVAR((&&text1 '&&text2'))";
Pattern patter1 = Pattern.compile("SETVAR\\w+&&(\\w+)'\\)\\)");
Matcher matcher = patter1.matcher(str);
String result = null;
if (matcher.find()) {
result = matcher.group(1);
}
System.out.println(result);
答案 0 :(得分:3)
一种方法是匹配括号中所有可能的模式:
String str = "Text SETVAR((&&text1 '&&text2'))";
Pattern patter1 = Pattern.compile("SETVAR[(]{2}&&\\w+\\s*'&&(\\w+)'[)]{2}");
Matcher matcher = patter1.matcher(str);
String result = "";
if (matcher.find()) {
result = matcher.group(1);
}
System.out.println(result);
请参阅IDEONE demo
你也可以在括号内使用[^()]*
来获得单撇号内的值:
Pattern patter1 = Pattern.compile("SETVAR[(]{2}[^()]*'&&(\\w+)'[)]{2}");
^^^^^^
请参阅another demo
让我为你打破正则表达式:
SETVAR
- 字面匹配SETVAR
,然后...... [(]{2}
- 按字面意思匹配2 (
,然后...... [^()]*
- 匹配(
或)
以外的0个或多个字符,直至... '&&
- 匹配单个撇号和两个&
符号,然后...... (\\w+)
- 匹配并捕获第1组中的一个或多个单词字符'[)]{2}
- 匹配单个撇号,然后匹配2个)
符号。答案 1 :(得分:2)
你的正则表达式与你的字符串不匹配,因为你没有指定打开的括号,\\w+
将匹配单词字符的任何组合,它与空格和&
不匹配。
相反,您可以使用否定字符类[^']+
,它将匹配长度为1或更多的字符组合,但一个引号除外:
String str = "Text SETVAR((&&text1 '&&text2'))";
"SETVAR\\(\\([^']+'&&(\\w+)'\\)\\)"