如何在Java中使用正则表达式切换字符

如何在Java中使用正则表达式切换字符,java,regex,Java,Regex,我想把“+”换成“-”,把“-”换成“+” 例如:++-+-+到-+-+- 如何使用正则表达式执行此操作 我尝试过使用replaceAll()函数,但它似乎不起作用,因为两个替换不能同时进行。您可以先将其中一个字符替换为未使用的字符: s = s.replace('-', '#'); s = s.replace('+', '-'); s = s.replace('#', '+'); 您可以先将其中一个字符替换为未使用的字符: s = s.replace('-', '#'); s = s.rep

我想把“+”换成“-”,把“-”换成“+”

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

如何使用正则表达式执行此操作

我尝试过使用
replaceAll()
函数,但它似乎不起作用,因为两个替换不能同时进行。

您可以先将其中一个字符替换为未使用的字符:

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

您可以先将其中一个字符替换为未使用的字符:

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

实现这一点的一个奇怪方法是在其中一个角色处拆分,比如+。然后用+替换所有结果块中的all-in,最后一步是将所有块连接到-

    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);
String str=“++--+++--+-++”;
字符串[]split=str.split(“[+]”,整数.MAX_值);
String[]chunks=新字符串[split.length];

对于(inti=0,l=split.length;i实现这一点的一种奇怪方法是在其中一个字符处拆分,比如+。然后将所有结果块中的all-in替换为+并作为最后一步将所有块连接为-

    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);
String str=“++--+++--+-++”;
字符串[]split=str.split(“[+]”,整数.MAX_值);
String[]chunks=新字符串[split.length];

对于(int i=0,l=split.length;i如果您使用的是Java 8,它现在支持一些更为函数式的编程,包括map.map之类的函数可以应用于流,在这种情况下,是从String.map创建的int流应用函数(在这种情况下是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 "-+-"

这样就不需要更改为中间字符并对字符串进行两次检查,您只需对每个字符检查一次。

如果您使用的是Java 8,它现在支持一些更为函数式的编程,包括map等函数。map可以应用于流,在这种情况下,是从字符串创建的int流.Map将函数(本例中为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 "-+-"

这样就不需要更改为中间字符并检查字符串两次,您只需查看每个字符一次。

好主意,您有一件小事,您应该用
\\+
更改它
+
,或者您可以使用
替换
而不是
替换所有
像这样的
s.replace(“-”,“\35;”).replace(“+”、“-”)。replace(“#”、“+”)
;)正如前面的一条评论所指出的,replaceAll将正则表达式作为其第一个参数,因此提供的代码将不起作用。相反,应将+替换为\\+,以便在Java和正则表达式中转义并搜索实际的+。@YCF_L非常乐意删除它,因为它现在已经更改了。尽管匆忙寻找答案意味着我们最终会得到废话连篇,因为人们想第一个回答,所以这根本不起作用。将继续否决投票错误的答案。好主意,你有一件小事,你应该用
\\+
更改
+
,或者你可以用
替换
而不是
替换所有的
像这样的
s.replace(“-”,“#”)替换(“+”,“-”).replace(“#”和“+”
;)正如前面的注释所指出的,replaceAll将正则表达式作为其第一个参数,因此提供的代码将不起作用。相反,应将+替换为\\+,以便在Java和Regex中转义并搜索实际的+。@YCF_L非常乐意删除它,因为它现在已更改。然而,急于回答问题意味着我们最终会满腹牢骚,所以这根本不起作用,因为人们想成为第一个回答问题的人。将继续投票表决错误答案。