2017-05-08 71 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