使用java正则表达式获取“$ {VALUE}”内的字符串的正则表达式抛出异常
public static void main(String[] args) {
String test = "Report for ${PROCESS_NAME} with status ${PROCESS_STATUS}";
String[] results = test.split("\\${([^\\{\\}]*)\\}");
for (String result : results) {
System.err.println(result);
}
}
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition near index 1
\${([^\{\}]*)\}
^
at java.util.regex.Pattern.error(Unknown Source)
at java.util.regex.Pattern.closure(Unknown Source)
at java.util.regex.Pattern.sequence(Unknown Source)
预期数组:results = PROCESS_NAME,PROCESS_STATUS;
输入测试字符串不是固定长度。什么是正则表达式错误。
答案 0 :(得分:2)
我建议这个解决方案
Matcher m = Pattern.compile("\\$\\{(.+?)\\}").matcher(test);
while(m.find()) {
System.out.println(m.group(1));
}
答案 1 :(得分:1)
您还需要转义{
:
test.split("\\$\\{([^\\{\\}]*)\\}")
此外,您不必在字符类中转义{}
:
test.split("\\$\\{([^{}]*)\\}")
答案 2 :(得分:1)
你的正则表达式中可能丢失了一个'\'。看起来应该是这样的:"\\$\\{([^\\{\\}]*)\\}"
。
但是,split()
方法无法执行您想要的操作。标记为here
此方法返回的数组包含此字符串的每个子字符串,该子字符串由与给定表达式匹配的另一个子字符串终止,或者以字符串的结尾终止。
您需要找到与指定模式匹配的子字符串。这可以这样做:
String patternString = "\\$\\{([^\\{\\}]*)\\}";
List<String> results = new ArrayList<String>();
String test = "Report for ${PROCESS_NAME} with status ${PROCESS_STATUS}";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher();
while(matcher.find()) {
results.add(matcher.group(1));
}