在某些条件下正则表达式重新匹配字符

时间:2014-05-02 20:34:33

标签: java regex

考虑输入字符串:

"Hi, I'm %name%. I pay 25% tax on my income. I live in %country%"

我想用%name%替换%country%?。踢球者是我必须将值保存在列表中。对于此示例,预期输出为:

"Hi, I'm ?. I pay 25% tax on my income. I live in ?"  

列表为["name", "country"]

目前我的实施是这样的:

String toTest = "Hi, I'm %name%. I pay 25% tax on my income. I live in %country%";

ArrayList<String> al = new ArrayList<>();

Pattern p = Pattern.compile("%(.*?)%");
Matcher m = p.matcher(toTest);
while(g)
{
    String g = m.group();
    switch(m.group())
    {
        case "%name%":
            al.add(name);
            toTest = toTest.replaceFirst("%name%", "?");
            break;
        case "%country%":
            al.add(country);
            toTest = toTest.replaceFirst("%country%", "?");
            break;
    }
}

String[] sa = al.toArray(new String[]{});
System.out.println(toTest);
System.out.println(Arrays.toString(sa));

此测试用例打破了它。实际输出是:

Hi, I'm ?. I pay 25% tax on my income. I live in %country%  
["name"]

我想要的是,在我的循环中,如果该组与switch语句中的任何内容都不匹配,那么我想使用最后一个&#34;%&#34;作为检查的一部分。我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

您的问题似乎在于(.*?)正则表达式%(.*?)%的一部分,它可以匹配

等部分
"Hi, I'm %name%. I pay 25% tax on my income. I live in %country%";
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

考虑使用%(\\w+)%仅接受%之间的字母数字字符 此外,如果您知道要替换哪些单词,则可以使用

之类的内容
%(name|country)%

另一项改进可能是使用来自appendReplacement类的appendTailMatcher,它会将当前找到的匹配项替换为另一个值,而不是需要从开始查找的replaceFirst匹配的部分,所以你的代码看起来像

    StringBuffer sb = new StringBuffer();
    while (m.find()) {
        m.appendReplacement(sb, "?");
        al.add(m.group(1));
    }
    m.appendTail(sb);
    toTest = sb.toString();

答案 1 :(得分:0)

您可以使用此正则表达式:

"%(\w+)%"
Java中的

Pattern p = Pattern.compile("%(\\w+)%");

您的Java代码代码也可以非常简化

String toTest = "Hi, I'm %name%. I pay 25% tax on my income. I live in %country%";
List<String> al = new ArrayList<String>();
Pattern p = Pattern.compile("%(\\w+)%");
Matcher m = p.matcher(toTest);
while(m.find()) {
    al.add(m.group(1));
    toTest = toTest.replaceFirst(m.group(0), "?");
}

System.out.println(toTest);
System.out.println(al);

<强>输出:

Hi, I'm ?. I pay 25% tax on my income. I live in ?
[name, country]