gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:24:01 24 4
gpt4 key购买 nike

考虑一个输入字符串:

"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 语句中的任何内容都不匹配,那么我想使用最后一个“%”作为检查的一部分。我该怎么做?

最佳答案

看来您的问题出在正则表达式 %(.*?)%(.*?) 部分,它可以匹配类似的部分

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

考虑使用 %(\\w+)% 仅接受 % 之间的字母数字字符。
另外,如果您知道要替换哪些词,您可以使用类似的东西

%(name|country)%

另一个改进可能是使用 Matcher 类中的 appendReplacementappendTail ,它们将用另一个值而不是 replaceFirst 替换当前找到的匹配项 需要从头开始迭代以找到匹配的部分,这样您的代码看起来像

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

关于java - 正则表达式在某些条件下重新匹配字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com