Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用正则表达式替换多集字符_Java_Spring_String_Java 8 - Fatal编程技术网

Java使用正则表达式替换多集字符

Java使用正则表达式替换多集字符,java,spring,string,java-8,Java,Spring,String,Java 8,我正在尝试编写一个字符串替换方法,它可以工作,但是在同一个字符串上使用多个替换方法看起来很糟糕。我很确定我可以在这里使用正则表达式 List<String> strng = Collections.singletonList(answer.toString() .replace(",", "/") .replace("#"", &qu

我正在尝试编写一个字符串替换方法,它可以工作,但是在同一个字符串上使用多个替换方法看起来很糟糕。我很确定我可以在这里使用正则表达式

        List<String>  strng = Collections.singletonList(answer.toString()
                .replace(",", "/")
                .replace("#"", " ")
                .replace("*", "")
                .replace("&", "")
                .replace("]", ""));
List strng=Collections.singletonList(answer.toString()
.替换(“,”,“/”)
.替换(“#”和“”)
.替换(“*”,“”)
.替换(“&”,”)
.替换(“]”,“”);
我只想使用1个replace()或replaceAll()方法。
简而言之,尝试构造正则表达式来替换这些字符,#*&]

使用正则表达式可以将最后三个调用替换为一个调用,如下所示:

List<String>  strng = Collections.singletonList(answer.toString()
                .replace(",", "/")
                .replace("#", " ")
                .replaceAll("[\\*&\\]]", ""));
输出:

public class Main {
    public static void main(String[] args) {
        String str = "Hello,Hi#Bye*World&Welcome]Good";
        System.out.println(str
                            .replace(",", "/")
                            .replace("#", " ")
                            .replaceAll("[\\*&\\]]", ""));
    }
}
Hello/Hi ByeWorldWelcomeGood

如果您碰巧使用了ApacheCommons库,则可以使用该方法

但是在我看来,仅仅因为一个包含库的方法是多余的

String str = "foobar,123#xyz*abc&def]";
String res = StringUtils.replaceChars(str, ",#*&]", "/ ");
System.out.println(res);

//output : foobar/123 xyzabcdef 

把它分成两部分

  • 删除所有字符(替换为空字符串(
    )。使用定义要删除的字符集的正则表达式使用
    string::replaceAll
    answer.replaceAll([*&\\\]],”)
  • 准备好两个包含替换前和替换后字符的字符串。执行两个字符串长度相同的规则,使每个字符完全相互替换(根据您的问题)。您可以使用
    String[]
    为此目的。遍历字符并将其替换为原始字符串
  • 如您所见,
    IntStream.range(int,int)
    非常方便。此外,您可以将删除结果本身用作reduce操作的
    标识



    免责声明:该解决方案仅适用于删除大量字符以避免重复。否则,一系列
    String::replace
    更合适。

    简单的正则表达式替换操作不支持一次操作中的条件替换

    如果启用了最新的JDK和“预览功能”,您可以

    static final Pattern SPECIAL_CHARS=Pattern.compile(“[,#*&\\\]”);
    
    List strng=List.of(
    特殊字符匹配器(answer.toString())
    .replaceAll(先生->开关(先生组().charAt(0)){
    案例','->“/”;
    大小写“#”->”;
    默认值->“”;
    }));
    
    与Java 8兼容的等效版本将更加详细:

    静态字符串替换特殊字符(字符串输入){
    匹配器m=特殊字符匹配器(输入);
    如果(!m.find())返回输入;
    StringBuffer sb=新的StringBuffer(input.length());
    做{
    字符串s;
    开关(m.组().字符(0)){
    大小写“,”:s=“/”中断;
    大小写“#”:s=”“;break;
    默认值:s=“”;
    }
    m、 (b,s);
    }而(m.find());
    返回m.appendTail(sb.toString();
    }
    

    虽然这些方法可以一次性执行操作,但您需要一个非常大的输入字符串才能从中获益。否则,您的普通(非正则)调用链
    replace
    可能会更有效。您甚至可以将前两个从
    string
    替换为
    char
    替换,即
    .replace(“,”,“/”).replace(“#“,”)
    。由于其他三个具有相同的替换,它们可以被单个
    .replaceAll(“[*&\\]]”,”)替换
    但正如前面所说,使用正则表达式引擎并不一定比多个纯文本替换操作更有效。

    我不认为这看起来很糟糕。@akuzminykh谢谢,但尝试即兴创作并尽量减少重复代码:)。如果您想用相同的东西替换它们,则适合使用正则表达式。但如果您用不同的东西替换它们,则最好使用多个方法调用。@icecool09供参考:我认为这很好。只因为您多次调用同一个方法,这并不“坏”“重复。坏的是有两行10行相同的代码(相对)。我认为你的代码非常清晰,不需要读者理解正则表达式,这对可读性和可维护性都有好处。当然,在这里使用正则表达式是一种大脑风格的代码,但在我看来,这并不是一个真正的改进。啊,这是真的。@akuzminykhGood points!我已经修复了这些缺陷:
    str[1]
    真的应该是
    映射[1]
    *
    也不应该存在,只要它先被删除,并且从未映射。
    字符串::concat
    是我在做实验时忘记了复制粘贴错误的结果。谢谢你留下评论!但是
    (l,r)->l
    也不是一个正确的组合器。它会丢弃在右侧部分所做的替换。我认为,类似于
    (l,r)->{throw new UnupportedOperationException();}
    的东西会更好。如果你想不惜一切代价引入
    reduce
    ,你可以使用
    字符串newAnswer=IntStream.range(0,mapping[0].length()
    
    String str = "foobar,123#xyz*abc&def]";
    String res = StringUtils.replaceChars(str, ",#*&]", "/ ");
    System.out.println(res);
    
    //output : foobar/123 xyzabcdef 
    
    String[] mapping = {",#", "  "};
    
    // The advantage is the code below remains the same regardles the number or replacements
    String newAnswer = IntStream.range(0, mapping[0].length()).boxed().reduce(
        answer.replaceAll("[*&\\]]", ""),
        (str, i) -> str.replace(mapping[0].charAt(i), mapping[1].charAt(i)),
        (l, r) -> l);