2017-04-08 94 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 "-+-" 

这样就没有必要改变,以中间的性格和过去的字符串两次,你只需要在每一个字符看一次。