java - 正则表达式不适用于 java 中的多个字符串拆分?

标签 java regex string split

我想用多个字符串定界符拆分字符串。 例如:

字符串是"abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy" 输出 : 美国广播公司 xyz pqr 卫星电视 adf fgr 过时的

我想按 "[11]"、 "[86]"、 "[87]"拆分字符串 尝试了以下代码但不起作用。

void testSplit() {
StringBuilder message = new StringBuilder("abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy");
    Map<String, String> replaceStringMap = new HashMap();
    replaceStringMap.put("\\\\[11\\\\]", "11");
    replaceStringMap.put("\\\\[86\\\\]", "86");
    replaceStringMap.put("\\\\[87\\\\]", "87");
    String starter = "(";
    String middle = ")|(";
    String end = ")";
    Set<String> keySet = replaceStringMap.keySet();
    boolean isFirst = true;
    StringBuilder regex = new StringBuilder(starter);
    Iterator<String> itr = keySet.iterator();
    while(itr.hasNext()) {
        String string = itr.next();
        if(itr.hasNext()) {
            regex.append(string);
            regex.append(middle);
        } else {
            regex.append(string);
            regex.append(end);
        }
    }
    System.out.println(regex.toString());
    String[] strings = message.toString().split(regex.toString());
    for(String s : strings) {
        System.out.println(s);
    }
}  

输出:

   (\\[87\\])|(\\[11\\])|(\\[86\\])
   abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
   Output:abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy

预期输出:

美国广播公司 xyz pqr 卫星电视 adf fgr 过时的

下面的代码有效:

String regex = "(\\[87\\])|(\\[11\\])|(\\[86\\])";

在这里,如果我对正则表达式进行硬编码,那么它就可以工作,但是当我通过从 map 读取值来动态生成正则表达式时,它就不起作用了。 问题是我无法在动态级别生成正则表达式。

最佳答案

您的分隔符中有一对额外的 \

鉴于此:

    StringBuilder message = new  StringBuilder("abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy");
    Map<String, String> replaceStringMap = new HashMap();
    replaceStringMap.put("\\[11\\]", "11");
    replaceStringMap.put("\\[86\\]", "86");
    replaceStringMap.put("\\[87\\]", "87");
    String starter = "(";
    String middle = ")|(";
    String end = ")";
    Set<String> keySet = replaceStringMap.keySet();
    boolean isFirst = true;
    StringBuilder regex = new StringBuilder(starter);
    Iterator<String> itr = keySet.iterator();
    while (itr.hasNext()) {
        String string = itr.next();
        if (itr.hasNext()) {
            regex.append(string);
            regex.append(middle);
        } else {
            regex.append(string);
            regex.append(end);
        }
    }
    System.out.println(regex.toString());
    String[] strings = message.toString().split(regex.toString());
    for (String s : strings) {
        System.out.println(s);
    }
}

它产生这个:

(\[86\])|(\[87\])|(\[11\])
abc
xyz
pqr
sdv
adf
fgr
fadggthy

关于java - 正则表达式不适用于 java 中的多个字符串拆分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31515372/

相关文章:

javascript - parseInt() 返回 NaN

java - logback:如何设置每个线程的日志记录级别?

php - 为什么这个字符串验证脚本不起作用?

javascript - 使用 Javascript 正则表达式匹配重音字符

php - 用于检测具有 onclick 或 onload 属性的 HTML 标签的正则表达式过于贪婪

java - 在记录器调试语句中使用字符串文字

java - 了解事件处理程序完成后如何执行某些操作、Android、Firebase

java - Spring Batch Item Writer 没有被调用

java - 如何在 JFreeChart 中以秒为单位省略分数?

java - Java如何获取字符串中通配符的值?