java正则表达式拆分字符串

java正则表达式拆分字符串,java,regex,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 res

使用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)
预期数组:结果=进程名称、进程状态


输入测试字符串不是固定长度的。正则表达式有什么问题。

您还需要转义
{

test.split("\\$\\{([^\\{\\}]*)\\}")
此外,您不必在字符类内转义
{}

test.split("\\$\\{([^{}]*)\\}")

您还需要转义
{

test.split("\\$\\{([^\\{\\}]*)\\}")
此外,您不必在字符类内转义
{}

test.split("\\$\\{([^{}]*)\\}")

我建议这个解决方案

    Matcher m = Pattern.compile("\\$\\{(.+?)\\}").matcher(test);
    while(m.find()) {
        System.out.println(m.group(1));
    }

我建议这个解决方案

    Matcher m = Pattern.compile("\\$\\{(.+?)\\}").matcher(test);
    while(m.find()) {
        System.out.println(m.group(1));
    }

您可能在regexp中丢失了一个“\”。它应该是这样的:
“\\$\\{([^\\{\\}]*)\}”

但是,
split()
方法不会执行您想要的操作

此方法返回的数组包含此字符串的每个子字符串,该子字符串由与给定表达式匹配的另一个子字符串终止,或由字符串结尾终止

您需要找到与指定模式匹配的子字符串。可以这样做:

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));
}
String patternString=“\\$\\{([^\\{\\}]*)\}”;
列表结果=新建ArrayList();
String test=“状态为${PROCESS\u status}的${PROCESS\u NAME}报告”;
Pattern=Pattern.compile(patternString);
Matcher Matcher=pattern.Matcher();
while(matcher.find()){
结果:添加(匹配组(1));
}

您可能在regexp中丢失了一个“\”。它应该是这样的:
“\\$\\{([^\\{\\}]*)\\}”

但是,
split()
方法不会执行您想要的操作

此方法返回的数组包含此字符串的每个子字符串,该子字符串由与给定表达式匹配的另一个子字符串终止,或由字符串结尾终止

您需要找到与指定模式匹配的子字符串。可以这样做:

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));
}
String patternString=“\\$\\{([^\\{\\}]*)\}”;
列表结果=新建ArrayList();
String test=“状态为${PROCESS\u status}的${PROCESS\u NAME}报告”;
Pattern=Pattern.compile(patternString);
Matcher Matcher=pattern.Matcher();
while(matcher.find()){
结果:添加(匹配组(1));
}

在转义美元符号后转义开头的花括号转义在转义美元符号后转义开头的花括号生成-“摘要报告”,“具有状态”。但我希望花括号内有字符串-“进程名称”,“进程状态”这是因为您按它拆分。如果需要匹配regexp,请使用。谢谢Ivan,我应该使用Matcher.Generates-“Summary Report for”,“with status”。但我希望在大括号内包含字符串-“PROCESS\u NAME”,“PROCESS\u status”这是因为你被它分割了。如果你需要匹配regexp,那么使用。谢谢Ivan,我应该使用Matcher..is表示任何字符。我想下面的表达式会更好:“\\$\{(\\w+?)\}”。is表示任何字符。我想下面的表达式会更好:“\\$\{(\\w+?)\}”