2017-08-06 36 views
1

我想替換兩個數字之間或數字與'。'之間的所有字符' - '。由炭 '&'。例如java String.replaceAll兩個數字之間的字符

字符串輸入= 「2.1(-7-11.3)-12.1 * -2.3-0.11」
字符串輸出=「2.1(-7 & 11.3)-12.1 * -2.3 & .11「

我有這樣的事情,但我嘗試做起來更容易。

public void preperString(String input) { 

    input=input.replaceAll(" ",""); 
    input=input.replaceAll(",",".");     
    input=input.replaceAll("-","&");    
    input=input.replaceAll("\\(&","\\(-");   
    input=input.replaceAll("\\[&","\\[-");   
    input=input.replaceAll("\\+&","\\+-"); 
    input=input.replaceAll("\\*&","\\*-"); 
    input=input.replaceAll("/&","/-"); 
    input=input.replaceAll("\\^&","\\^-"); 
    input=input.replaceAll("&&","&-"); 
    input=input.replaceFirst("^&","-"); 

    for (String s :input.split("[^.\\-\\d]")) { 
     if (!s.equals("")) 
     numbers.add(Double.parseDouble(s)); 
    } 
+0

在一次調用中執行:'replaceAll(「(?!\\ .- \\。)([0-9。]) - ([0-9。])」,「$ 1&$ ​​2」)''。演示請參見[regex101.com](https://regex101.com/r/wNzXQ3/1)。 – Andreas

回答

0

讓我猜。這裏你並沒有真正使用&;你只是試圖用&替換某些減號,以便它們不會干擾您試圖用來查找所有數字的split(這樣split不會返回"-7-11"作爲數組元素之一,在你原來的例子中)。那是對的嗎?

如果我的猜測是正確的,那麼正確的答案是:不要使用split。這是工作的錯誤工具。 split的目的是通過查找分隔符模式(例如一個空格或逗號序列)來分割一個字符串;但是分隔符之間元素的格式並不重要。不過,就你而言,你正在尋找特定數字格式的元素(它可能以-開頭,否則至少有一位數字和最多一個句點;我不知道你的具體要求是什麼)。在這種情況下,取代split,正確的方法是爲您想要的數字創建一個正則表達式,然後在循環中使用m.find(其中mMatcher)以獲取所有數字。

如果需要以不同方式對待一些-字符(例如在-7-11,要將第二-是一個運營商,而不是-11一部分),那麼你可以讓那個特別的檢查,在循環,並跳過在-的跡象表明,你知道你想作爲運營商對待。

這很簡單,讀者會明白你想要做什麼,而且不太容易出錯,因爲你所要做的就是確保你的數字表達模式準確地反映了你要找的東西。

新的Java程序員認爲正則表達式和split是可以解決所有問題的神奇工具很常見。但通常結果會變得太複雜(代碼使用過於複雜的正則表達式,或者依賴於像臨時替換字符&這樣的技巧)。我不能看你的原始代碼,並說服自己,它的工作原理是正確的。這不值得。

1

您可以使用正則表達式的羣體解決您的問題,使其在一杆,你可以使用這個:

String input = "2.1(-7-11.3)-12.1*-2.3-.11"; 
input = input.replaceAll("([\\d.])-([\\d.])", "$1&$2"); 

輸出

2.1(-7&11.3)-12.1*-2.3&.11 

([\\d.])-([\\d.]) 
//  ^------------replace the hyphen(-) that it between 
// ^__________^--------two number(\d) 
// ^_^______^_^------or between number(\d) and dot(.) 

regex demo

相關問題