我有一个文件,其中包含如下数据:
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将正则表达式作为拆分条件.现在,(在正则表达式中用于捕获组,因此如果要匹配它,则需要将其转义.
你有两种方法: -
逃离支架: -
sysCallName.split("\\(");
Run Code Online (Sandbox Code Playgroud)使用Character class: -
sysCallName.split("[(]");
Run Code Online (Sandbox Code Playgroud)在一个字符类中,所有元字符都松散了它们的特殊含义,所以a (只是a (,而a dot(.)只是a dot(.).就个人而言,我更喜欢第二种选择,因为它看起来更清晰.
逃避你的字符串.代替
sysCallName.split("(");
Run Code Online (Sandbox Code Playgroud)
尝试
sysCallName.split("\\(");
Run Code Online (Sandbox Code Playgroud)
你必须添加一个转义字符:
String[] sysCallTokens = sysCallName.split("\\(");
Run Code Online (Sandbox Code Playgroud)