将以下内容与正则表达式匹配

时间:2011-10-20 16:10:25

标签: java regex

我需要将以下字符串与Java中的正则表达式匹配:

  

您好:$ {firstName} $ {lastName}

得到这个:

$ {的firstName}

$ {lastName的}

我试过了:

@Test
    public void testRegexMatch() {
        String regex = Pattern.quote("${") + ".+" + Pattern.quote("}");
        String str = "Hello: ${firstName} ${lastName}";
        Matcher m = Pattern.compile(regex).matcher(str);
        while (m.find()) {
            System.out.println(str.substring(m.start(), m.end()));
        }
    }

但我得到了以下输出:

  

$ {firstName} $ {lastName}

5 个答案:

答案 0 :(得分:2)

尝试将.+替换为[^\}]+。这将匹配尽可能多的非}字符。

同样重要的是要注意,此方法优于使用非贪婪量词.+?,因为这将匹配而不进行任何回溯,而非贪婪版本将在括号内每个字符回溯一次。在这种情况下,您可能不会注意到性能损失,但重要的是养成尽可能编写最有效的正则表达式的习惯

答案 1 :(得分:2)

以下内容符合$ {anything}

(\$\{[^\}]+\})

答案 2 :(得分:1)

尝试:

public void testRegexMatch() {
    String regex = Pattern.quote("${") + "(.+?)" + Pattern.quote("}");
    String str = "Hello: ${firstName} ${lastName}";
    Matcher m = Pattern.compile(regex).matcher(str);
    while (m.find()) {
        System.out.println(m.group(1));
    }
}

答案 3 :(得分:1)

+是一个贪婪的量词,并尽可能多地匹配输入,因此你的正则表达式会匹配到}的{​​{1}}。所以,你需要使用${lastName}这里不情愿的quatifier,它应该可以正常工作。您只需更改第一行代码

即可

?

答案 4 :(得分:0)

String test = "Hello: ${firstName} ${lastName}";    
Pattern p = Pattern.compile("\\Q${\\E[a-zA-Z]*\\Q}\\E");
Matcher m = p.matcher(test);
while(m.find()){
    System.out.println(m.group());
}

替换

[a-zA-Z]*

随心所欲