Подтвердить что ты не робот

Ошибка 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)

Любая идея, что я делаю неправильно?

4b9b3361

Ответ 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(",");