Ошибка string.parse( "(" )
У меня есть файл, который содержит следующие данные:
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
принимает регулярное выражение как критерии разделения. Теперь (
в regex используется для захвата групп, поэтому вам нужно его избежать, если вы хотите его сопоставить.
У вас есть два способа: -
-
Выйдите из скобки: -
sysCallName.split("\\(");
-
Используйте Character class
: -
sysCallName.split("[(]");
В классе символов все метасимволы теряют свое особое значение, поэтому (
является просто a (
, а a dot(.)
является просто a dot(.)
. Лично я предпочитаю второй вариант, так как он выглядит более понятным.
Ответ 3
удалите строку. вместо
sysCallName.split("(");
попробуйте
sysCallName.split("\\(");
Ответ 4
Вам нужно добавить escape char:
String[] sysCallTokens = sysCallName.split("\\(");
Ответ 5
(
является зарезервированным символом для регулярных выражений
Вы можете исправить это, префиксную его обратным слэшем: \(
Ответ 6
При попытке разделения с помощью специальных символов вам нужно использовать \\
с вашим специальным символом. поэтому попробуйте вот так
sysCallName.split("\\(");
вы можете найти разделительные строки с другими специальными символами из здесь
Ответ 7
Попробуйте использовать эту строку в своем коде
String[] sysCallTokens = sysCallName.split("\\(");
(Только добавленный символ эвакуации перед открывающей скобкой)
Ответ 8
Вы можете попробовать Pattern.quote, например:
sysCallName.split(Pattern.quote(")"));
Если вы хотите разбить любую строку с помощью специальных символов, вы можете использовать вышеуказанный метод.
Ответ 9
Вы можете захватить данные подобно массиву:
String[] result = line.split("\\\\(")[1].split("\\\\)").split(",");