2010-01-27 85 views
0

我已经写了下面的代码行:问题()

str.replaceAll("xxx(ayyy)xxx", "$1".substring(0,1).equals("a") ? "a" : "b"); 

但是我发现, “$ 1” .substring(0,1)将输出 “$”,而不是 “一”。有什么办法解决这个问题吗?

+0

叫我疯了,但到底是什么'$ 1'那儿?我不明白这与怎么回事有关。 – 2010-01-27 02:19:26

+1

我收集$ 1应该代表组匹配(ayyy),但Slaks alleyy说为什么这不起作用。 @Alan,试着告诉我们你想做什么而不是你想做什么。几乎总是有一个更好的方法:-) – paxdiablo 2010-01-27 02:21:07

+0

@Anthony:它应该匹配正则表达式中的第一个捕获组。 – SLaks 2010-01-27 02:22:17

回答

3

的第二个参数replaceAll是有规律的字符串。

Java将它传递给函数,而不是每场比赛之前,评估你的参数。
"$1".substring(0,1)简单地返回字符串$1的第一个字符。

你需要调用Matcher类的appendReplacement方法在一个循环。

+0

良好的渔获,@Slaks,我收集OP正试图取代 'xxxNyyyxxx' 与 'A' 当N = = 'A' 或 'B' 时,N!= 'A'。但既然它是'a',他们可能只是用'a'代替'xxxayyyxxx',而不是小组。 – paxdiablo 2010-01-27 02:19:39

+1

@paxdiablo:我认为这只是一个例子,而且他并没有替换硬编码的字符串。 – SLaks 2010-01-27 02:21:25

+1

非常感谢您的明确解释!我知道现在该做什么。谢谢 – Alan 2010-01-27 02:25:48

-2

子(起点,终点)将让你从一开始,直到子一端之前。如果你想消除的第一个元素试子(1,lengthOfString)

+0

他意识到这一点;那不是他的问题。 – SLaks 2010-01-27 02:15:50

3

如果你想为每个匹配应用不同的替代品,使用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);