Разделить строку на * в Java? - PullRequest
3 голосов
/ 20 августа 2011

Я хочу разделить String в Java на *, используя метод split.Вот код:

String str = "abc*def";
String temp[] = str.split("*");
System.out.println(temp[0]);

Но эта программа выдает мне следующую ошибку:

Exception in thread "main" java.util.regex.PatternSyntaxException: 
Dangling meta character '*' near index 0 *

Я немного подправил код, используя '\\*' в качестве разделителя, который работаетв совершенстве.Кто-нибудь может объяснить это поведение (или предложить альтернативное решение)?

Я не хочу использовать StringTokenizer.

Ответы [ 3 ]

5 голосов
/ 20 августа 2011

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

Таким образом, ваш код становится:

String str = "abc*def";
String temp[] = str.split("\\*");
System.out.println(temp[0]);    // Prints "abc"

Примечание\\: вам также нужно избежать косой черты для Java.

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

1 голос
/ 20 августа 2011

Split принимает регулярное выражение для разделения, а не строку. Регулярные выражения имеют * как зарезервированный символ, поэтому вам нужно экранировать его обратной косой чертой.

В частности, в Java обратные слеши в строках также являются специальными символами. Они используются для перевода строки (\ n), табуляции (\ t) и многих других менее распространенных символов.

Итак, поскольку вы пишете Java и пишете регулярное выражение, вам нужно дважды экранировать символ *. И, таким образом, '\ *'.

1 голос
/ 20 августа 2011

String.split () ожидает регулярное выражение.В регулярном выражении * имеет специальное значение (0 или более классов символов перед ним), поэтому его необходимо экранировать.\* выполняет это.Поскольку вы используете строку Java, \\ является escape-последовательностью для \, поэтому ваше регулярное выражение просто становится \*, которое ведет себя правильно.

...