функция разделения Java - PullRequest
       14

функция разделения Java

8 голосов
/ 10 марта 2011

Может ли кто-нибудь помочь мне понять, как split в Java работает. У меня есть следующий код

String temp_array[];           
    String rates = "RF\\0.6530\\0.6535\\D";
    String temp = rates.substring(1, rates.length());
    System.out.println(temp);// prints F\0.6530\0.6535\D
    String regex = "\\";
    temp_array = temp.split(regex);
    String insertString = "INSERT into table values("+temp_array[0]+","+temp_array[1]+","+temp_array[2]+","+temp_array[3]+")";

, однако в функции split я получаю следующее исключение

Exception in thread "main" java.util.regex.PatternSyntaxException: Unexpected internal error near index 1
\
 ^
    at java.util.regex.Pattern.error(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 simple_hello.main(simple_hello.java:15)

Ответы [ 6 ]

23 голосов
/ 10 марта 2011

Когда вы набираете "\\", это фактически одна обратная косая черта (из-за экранирования специальных символов в строках Java).

Регулярные выражения также используют обратную косую черту в качестве специального символа, и вам нужно избегать ее с другой обратной косой чертой. Итак, в конце вам нужно передать "\\\\" как шаблон, чтобы соответствовать одиночному обратному слешу.

4 голосов
/ 10 марта 2011

\ - это специальный символ в регулярных выражениях, а также в строковых литералах Java. Если вы хотите использовать обратную косую черту в регулярном выражении, вы должны удвоить его дважды. Попробуйте \\\\ (становится \\ после лексизации, становится литералом \ для анализатора регулярных выражений).

2 голосов
/ 10 марта 2011

Вы должны исправить свое регулярное выражение. Должно быть:

String regex = "\\\\";

потому что двойной обратный слеш является escape-последовательностью для строк Java.

2 голосов
/ 10 марта 2011

Заменить

String regex = "\\";

с

String regex = "\\\\";

2 голосов
/ 10 марта 2011

Вы должны избегать '\' char в шаблонах регулярных выражений, поэтому ваше регулярное выражение в основном будет

String regex = "\\\\";
2 голосов
/ 10 марта 2011

Вы пытаетесь разбить строку на обратную косую черту, вам необходимо использовать:

String regex = "\\\\";

\ - escape-символ для строки Java и механизма регулярных выражений.Таким образом, строка Java \\ передается в механизм регулярных выражений как \, который является неполным, поскольку за \ должен следовать символ, который он пытается экранировать.

Строка \\\\ передается в механизм регулярных выражений как \\, то есть \, экранирующий \, что фактически означает литерал \.

...