java正则表达式拆分字符串

时间:2014-04-16 01:43:03

标签: java regex

使用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;

输入测试字符串不是固定长度。什么是正则表达式错误。

3 个答案:

答案 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));
}