我已经写了下面的代码行:问题()
str.replaceAll("xxx(ayyy)xxx", "$1".substring(0,1).equals("a") ? "a" : "b");
但是我发现, “$ 1” .substring(0,1)将输出 “$”,而不是 “一”。有什么办法解决这个问题吗?
我已经写了下面的代码行:问题()
str.replaceAll("xxx(ayyy)xxx", "$1".substring(0,1).equals("a") ? "a" : "b");
但是我发现, “$ 1” .substring(0,1)将输出 “$”,而不是 “一”。有什么办法解决这个问题吗?
的第二个参数replaceAll
是有规律的字符串。
Java将它传递给函数,而不是每场比赛之前,评估你的参数。
"$1".substring(0,1)
简单地返回字符串$1
的第一个字符。
你需要调用Matcher
类的appendReplacement
方法在一个循环。
子(起点,终点)将让你从一开始,直到子一端之前。如果你想消除的第一个元素试子(1,lengthOfString)
他意识到这一点;那不是他的问题。 – SLaks 2010-01-27 02:15:50
如果你想为每个匹配应用不同的替代品,使用appendReplacement
/appendTail
:
Pattern p = Pattern.compile("xxx(ayyy)xxx");
StringBuffer out = new StringBuffer();
Matcher m = p.matcher("...");
while (m.find()) {
m.appendReplacement(out, m.group(1).substring(0, 1).equals("a") ? "a" : "b");
}
m.appendTail(out);
叫我疯了,但到底是什么'$ 1'那儿?我不明白这与怎么回事有关。 – 2010-01-27 02:19:26
我收集$ 1应该代表组匹配(ayyy),但Slaks alleyy说为什么这不起作用。 @Alan,试着告诉我们你想做什么而不是你想做什么。几乎总是有一个更好的方法:-) – paxdiablo 2010-01-27 02:21:07
@Anthony:它应该匹配正则表达式中的第一个捕获组。 – SLaks 2010-01-27 02:22:17