考虑输入字符串:
"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;作为检查的一部分。我怎么能这样做?
答案 0 :(得分:3)
您的问题似乎在于(.*?)
正则表达式%(.*?)%
的一部分,它可以匹配
"Hi, I'm %name%. I pay 25% tax on my income. I live in %country%";
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
考虑使用%(\\w+)%
仅接受%
之间的字母数字字符
此外,如果您知道要替换哪些单词,则可以使用
%(name|country)%
另一项改进可能是使用来自appendReplacement
类的appendTail
和Matcher
,它会将当前找到的匹配项替换为另一个值,而不是需要从开始查找的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]