按字符数组拆分字符串

时间:2013-08-30 07:24:18

标签: java regex arrays split

我想按字符数组拆分字符串, 所以我有这个代码:

String target = "hello,any|body here?";
char[] delim = {'|',',',' '};
String regex = "(" + new String(delim).replaceAll("(.)", "\\\\$1|").replaceAll("\\|$", ")");
String[] result = target.split(regex);

一切正常,除非我想在delim []数组中添加像'Q'这样的字符, 抛出异常:

java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 11
(\ |\,|\||\Q)

那么如何解决这个问题呢?

提前致谢

3 个答案:

答案 0 :(得分:2)

  

我如何解决这个问题呢?

在角色周围放置方括号,而不是转义它们。确保如果您的字符列表中包含^,则需要确保它不是第一个字符,如果它是列表中唯一的字符,则需要单独转义。

Dashes也需要特殊处理 - 它们需要在正则表达式的开头或结尾处进行。

String delimStr = String(delim);
String regex;
if (delimStr.equals("^") {
    regex = "\\^"
} else if (delimStr.charAt(0) == '^') {
    // This assumes that all characters are distinct.
    // You may need a stricter check to make this work in general case.
    regex = "[" + delimStr.charAt(1) + delimStr + "]";
} else {
    regex = "[" + delimStr + "]";
}

答案 1 :(得分:1)

使用Pattern.quote并将其置于方括号中似乎有效:

String regex = "[" + Pattern.quote(new String(delim)) + "]";

Tested with possible problem characters

答案 2 :(得分:0)

Q不是正则表达式中的控制字符,因此您不必将\\放在它之前(它仅用于标记您必须将以下字符解释为文字,并且不作为控制角色)。

实施例

`\\.` in a regex means "a dot"

`.` in a regex means "any character"

\\Q失败,因为Q在正则表达式中不是特殊字符,所以不需要引用它。

我会使delim成为一个String数组,并将引号添加到需要它的这些值中。

 delim = {"\\|", ..... "Q"};