1

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

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)

那么我该如何解决它以使用非特殊字符呢?

提前致谢

4

3 回答 3

2

我怎样才能修复它以使用非特殊字符

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

破折号也需要特殊处理——它们需要放在正则表达式的开头或结尾。

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 + "]";
}
于 2013-08-30T07:28:21.757 回答
1

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

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

用可能的问题字符进行了测试

于 2013-08-30T07:44:48.297 回答
0

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

例子

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

`.` in a regex means "any character"

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

我会创建delim一个字符串数组并将引号添加到需要它的这些值中。

 delim = {"\\|", ..... "Q"};
于 2013-08-30T07:28:30.387 回答