string.parse(“(”) error

2022-09-01 14:51:19

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

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)

你知道我做错了什么吗?


答案 1

您必须转义左括号:

sysCallName.split("\\(");

因为需要正则表达式,并且括号用于在正则表达式中标记捕获组。所以他们需要成对。如果你只想要一个括号,它需要被转义。split()


答案 2

String#split 采用正则表达式作为拆分条件。现在,在正则表达式中用于捕获组,因此如果要匹配它,则需要对其进行转义。(

您有两种方法: -

  1. 转义支架:-

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

    sysCallName.split("[(]");
    

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