2017-04-08 37 views
1

如何轉換角色,我想改用「+」到「 - 」和「 - 」到「+」使用正則表達式中的Java

例如:+ + - + - + +- - + - + - -

我怎樣才能做到這一點使用正則表達式
我試過使用replaceAll()函數,但它似乎不工作,因爲兩個替換不能同時發生。

回答

2

你可以先更換未使用的字符的東西之一:

s = s.replace('-', '#'); 
s = s.replace('+', '-'); 
s = s.replace('#', '+'); 
+0

好主意,你有一個小東西,你應該用'\\ +'改變''''或者你可以使用'replace'而不是'replaceAll'就像這樣's.replace(「 - 」,「#」 「).replace(」+「,」 - 「)。replace(」#「,」+「)';) –

+0

正如先前的註釋所指出的,replaceAll將正則表達式作爲其第一個參數,因此代碼提供不管用。相反,+應該用\\ +替換,以便在Java和正則表達式中都可以轉義並搜索實際的+。 –

+0

我會更新答案。 – john16384

1

一種不可思議的方式實現這一目標是在人物之一拆分,假設+。然後全部替換 - 在所有結果塊中加+,並作爲最後一步將所有塊連接爲 - 。

String str = "++--+++---+-++"; 
    String[] split = str.split("[+]", Integer.MAX_VALUE); 
    String[] chunks = new String[split.length]; 
    for (int i = 0, l = split.length; i<l; i++) { 
     chunks[i] = split[i].replaceAll("-", "+"); 
    } 
    String result = String.join("-", chunks); 
1

如果您正在使用Java 8,它現在支持一些更實用的樣式編程,其中包括諸如map之類的函數。 Map可以應用於流,在這種情況下,可以使用從String創建的Ints流。地圖應用的功能(在這種情況下lambda函數)該流的每個成員,並輸出別的東西:

.map(x -> x) 

將基本上什麼也不做,因爲這將輸出你輸入時,流將保持不變。在lambda函數中應用邏輯允許您根據某些條件確定輸出。

然後將這個轉換後的流一起收回到字符串生成器中,然後作爲字符串輸出。

String str = "+-+"; 

String inverted = str.chars().map(x -> x == '+' ? '-' : '+') 
        .collect(StringBuilder::new, 
           StringBuilder::appendCodePoint, 
           StringBuilder::append) 
        .toString(); 

// inverted now contains "-+-" 

這樣就沒有必要改變,以中間的性格和過去的字符串兩次,你只需要在每一個字符看一次。