考虑以下字符串:“ $ {test.one} $ {test.two}”我希望我的正则表达式返回两个匹配项,即“ test.one”和“ test.two”。为此,我有以下代码段:
导入java.util.regex.Matcher; 导入java.util.regex.Pattern;
public class RegexTester {
private static final Pattern pattern = Pattern.compile("\\$\\{((?:(?:[A-z]+(?:\\.[A-z0-9()\\[\\]\"]+)*)+|(?:\"[\\w/?.&=_\\-]*\")+)+)}+$");
public static void main(String[] args) {
String testString = "${test.one}${test.two}";
Matcher matcher = pattern.matcher(testString);
while (matcher.find()) {
for (int i = 0; i <= matcher.groupCount(); i++) {
System.out.println(matcher.group(i));
}
}
}
}
我还有其他一些东西,因为我希望这也可以是有效的匹配$ {test.one} $ {“ hello”}。
因此,基本上,我只希望它与$ {}内的任何内容匹配,只要它遵循以下格式:something.somethingelse
(仅字母数字)或something.somethingElse()
或{{1} }(字母数字加上一些其他字符)。我正在使用主要的正则表达式,或者大概是这样,但是当我运行代码时,它会发现两个组,
$ {test.two} test.two
我希望输出为
test.one test.two
答案 0 :(得分:2)
基本上,您的正则表达式主要问题在于它仅在字符串的末尾匹配,并且您还匹配了更多只用[A-z]
字母组成的字符。您的分组似乎也关闭了。
如果您在regex101上加载正则表达式,则您will see匹配
\$\{
(
-捕获组的开始
(?:
-一个非捕获组的开始
(?:[A-z]+
-一个非捕获组的开始,它在A
和z
(your first mistake)之间匹配1个以上的字符
(?:\.[A-z0-9()\[\]\"]+)*
-重复.
的0次或更多次,然后是1个以上的字母,数字,(
,)
,[
,{{1} },]
,"
,\
,^
和反引号_
-重复非捕获组1次或更多次)+
-或|
-(?:\"[\w/?.&=_\-]*\")+
,0个或多个单词,"
,/
,?
,.
,{ {1}},&
,=
字符,然后是_
-
-重复1次以上的组模式"
-非捕获组的结尾)+
-1个以上的)
字符}+
-字符串的结尾。要匹配字符串中任何出现的模式,您需要使用
}
请参见regex demo,找到匹配项后获取第1组的值。详细信息:
$
-一个\$\{(\"[^\"]*\"|\w+(?:\(\))?(?:\.\w+(?:\(\))?)*)}
子字符串\$\{
-捕获组1:
${
-(\"[^\"]*\"|\w+(?:\(\))?(?:\.\w+(?:\(\))?)*)
,除了\"[^\"]*\"
以外的0多个字符,然后是"
"
-或"
-1个以上的字符和一个可选的|
子字符串\w+(?:\(\))?
-()
的0个或多个重复,然后是1+个单词字符和一个可选的(?:\.\w+(?:\(\))?)*
子字符串.
-一个()
字符。请参见Java demo:
}
输出:
}
答案 1 :(得分:0)
您可以使用正则表达式
(?<=\$\{")[a-z]+(?="\})|(?<=\$\{)[a-z]+\.[a-z]+(?:\(\))?(?=\})
没有捕获组。可以根据需要修改字符类[a-z]
,前提是它们不包含双引号,句号或右括号。
Java的正则表达式引擎执行以下操作。
(?<=\$\{") # match '${"' in a positive lookbehind
[a-z]+ # match 1+ lowercase letters
(?="\}) # match '"}' in a positive lookahead
| # or
(?<=\$\{) # match '${' in a positive lookbehind
[a-z]+ # match 1+ lowercase letters
\.[a-z]+ # match '.' followed by 1+ lowercase letters
(?:\(\))? # optionally match `()`
(?=\}) # match '}' in a positive lookahead