2017-05-08 36 views
0

我用一个非常简单的例子这里:JAVA正则表达式模式匹配replacechall重复输入

Pattern pattern = Pattern.compile("(.*)"); 
    Matcher matcher=pattern.matcher("10110"); 
    String returnString = matcher.replaceAll("DATUM $1"); 

给出returnString = “DATUM 10110DATUM” 而不是 “10110 DATUM”。

这里有什么问题?

编辑:虽然使用(。+)解决了这个问题,但它仍然是一个非常奇怪的正则表现。由于(。*)已经匹配了整个输入,所以java会附加另一个 - empty - group,它不会作为replaceAll语句中的第二个组(通常为$ 2)引用。但是JAVA吐出了这第二组。幸运的是,在添加更多空组匹配之前,它确实停止。

+0

这是一个已知的问题在很多语言摄制的''字符串匹配,然后。 Ë nd的字符串。所以,你在这里有两场比赛。 –

+2

使用https://regex101.com。在这里你可以很容易地发现问题 – Vaibs

+0

其他在线的java正则表达式测试人员并不是那么好: - (( – josef

回答

2

挖掘越来越多后,发现奇怪的解决方案:Regexp grouping and replaceAll with .* in Java duplicates the replacement

而不是我现在用的(+)对空组没有得到重复的结果(*): - ((

现在修正的样本是:

Pattern pattern = Pattern.compile("(.+)"); 
    Matcher matcher=pattern.matcher("10110"); 
    String returnString = matcher.replaceAll("DATUM $1"); 

,并给出正确的“DATUM 10110”

+1

)当然,在'replaceAll'中使用'。*'是没有意义的当你需要删除时,你通常想要删除* something *,而不是一个空字符串,否则,你需要使用'^。* $'。 –

+1

请注意,这个查询仍然没有多大意义,因为它可以更容易地连接值甚至一个String.format(“DATUM%s”,“10110”);对于更复杂的连接就足够了,这个组就是一切,所以为什么要打扰一个正则表达式?多行,这将是唯一有效的原因guess – AxelH

+0

这是使用正则表达式搜索和替换的规则列表的一部分,也就是说我的代码可以使用\ u001D =>和另一条规则行(。+)=> $ 1 \ n来完成全局指令。 ://github.com/hjgode/TotalFreedomDataEdit/blob/master/TotalFreedomRegex/s RC /主/ JAVA/HSM /演示/ totalfreedom/DataEdit.java – josef