27

我有一个文件,其中包含如下数据:

recv(1178884, NULL, 4294967267, 0)      = 0
......
......

我的源代码是:

try (BufferedReader br = new BufferedReader(new FileReader("D:\\smsTrace.txt"))) {
    String sCurrentLine;

    while ((sCurrentLine = br.readLine()) != null) {
        String sysCallName = sCurrentLine;
        String[] sysCallTokens = sysCallName.split("(");
        System.out.println(sCurrentLine);
    }
} catch (IOException e) {
    e.printStackTrace();
} 

当我拆分sysCallName.split(",")它时工作正常,但是当我如上所述使用时,它会引发以下异常。

Exception in thread "main" java.util.regex.PatternSyntaxException: Unclosed group near index 1
(
 ^
    at java.util.regex.Pattern.error(Unknown Source)
    at java.util.regex.Pattern.accept(Unknown Source)
    at java.util.regex.Pattern.group0(Unknown Source)
    at java.util.regex.Pattern.sequence(Unknown Source)
    at java.util.regex.Pattern.expr(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.util.regex.Pattern.<init>(Unknown Source)
    at java.util.regex.Pattern.compile(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at java.lang.String.split(Unknown Source)
    at fileReading.main(fileReading.java:19)

知道我做错了什么吗?

4

9 回答 9

59

您必须转义左括号:

sysCallName.split("\\(");

因为split()需要一个正则表达式,并且括号用于标记正则表达式中的捕获组。所以他们需要成对出现。如果您只想要一个括号,则需要对其进行转义。

于 2012-12-19T09:04:53.547 回答
17

String#split将正则表达式作为拆分条件。现在,(正则表达式用于捕获组,所以如果你想匹配它,你需要转义它。

你有两种方法: -

  1. 转义括号: -

    sysCallName.split("\\(");
    
  2. 用途Character class:-

    sysCallName.split("[(]");
    

在一个字符类中,所有的元字符都失去了它们的特殊含义,所以 a(只是 a (,而 adot(.)只是 a dot(.)。就个人而言,我更喜欢第二种选择,因为它看起来更清晰。

于 2012-12-19T09:07:43.307 回答
6

逃脱你的字符串。代替

sysCallName.split("(");

尝试

sysCallName.split("\\(");
于 2012-12-19T09:04:24.620 回答
5

您必须添加一个转义字符:

String[] sysCallTokens = sysCallName.split("\\(");
于 2012-12-19T09:05:07.183 回答
4

(是正则表达式的保留字符

您可以通过在其前面加上反斜杠来解决此问题:\(

于 2012-12-19T09:04:32.813 回答
4

在尝试使用特殊字符进行拆分时,您需要使用\\特殊字符。所以在这里尝试这样

sysCallName.split("\\(");

你可以从这里找到用其他特殊字符分割字符串

于 2012-12-19T09:07:38.317 回答
3

尝试在您的代码中使用这一行

String[] sysCallTokens = sysCallName.split("\\(");

(只是在左括号前添加了转义字符)

于 2012-12-19T09:06:32.093 回答
3

您可以尝试Pattern.quote,例如:

sysCallName.split(Pattern.quote(")"));

如果要使用特殊字符分割任何字符串,可以使用上述方法。

于 2012-12-19T09:36:58.503 回答
1

您可以像获取数组一样获取数据:

String[] result = line.split("\\\\(")[1].split("\\\\)").split(",");
于 2015-07-21T14:29:16.470 回答