string.parse("(")错误

Jun*_*aid 23 java regex split

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

recv(1178884, NULL, 4294967267, 0)      = 0
......
......
Run Code Online (Sandbox Code Playgroud)

我的源代码是:

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();
} 
Run Code Online (Sandbox Code Playgroud)

当我拆分时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)
Run Code Online (Sandbox Code Playgroud)

知道我做错了什么吗?

jlo*_*rdo 54

你必须逃脱开场括号:

sysCallName.split("\\(");
Run Code Online (Sandbox Code Playgroud)

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


Roh*_*ain 17

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

你有两种方法: -

  1. 逃离支架: -

    sysCallName.split("\\(");
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用Character class: -

    sysCallName.split("[(]");
    
    Run Code Online (Sandbox Code Playgroud)

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


gef*_*fei 6

逃避你的字符串.代替

sysCallName.split("(");
Run Code Online (Sandbox Code Playgroud)

尝试

sysCallName.split("\\(");
Run Code Online (Sandbox Code Playgroud)


Luc*_*nzo 5

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

String[] sysCallTokens = sysCallName.split("\\(");
Run Code Online (Sandbox Code Playgroud)