在java中使用Regex进行多个字符串拆分?

时间:2015-07-20 11:31:00

标签: java regex string string-split

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

字符串是" abc [11] xyz [86] pqr [87] sdv [11] adf [86] fgr [87] fadggthy" 输出: ABC XYZ PQR SDV ADF FGR fadggthy

我想用" [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

预期产出:

ABC XYZ PQR SDV ADF FGR fadggthy

以下代码有效:

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

这里,如果我硬编码正则表达式,那么它的工作原理,但当我通过从地图读取值动态生成正则表达式,然后它不起作用。 问题是我无法在动态级别生成正则表达式。

2 个答案:

答案 0 :(得分:2)

您的分隔符中还有一对\

鉴于此:

    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

答案 1 :(得分:1)

一般解决方案,对于[]视为分隔符之间的任何值:

String test = abc[11]xyz[86]pqr[87]sdv[11]adf[86]fgr[87]fadggthy
String r = "(\\[[^\\]]*\\])"
for(String part : test.split(r)) println(part)

> abc
> xyz
> pqr
> sdv
> adf
> fgr
> fadggthy