2013-06-27 2 views
0

replaceAll со значением, содержащим '*', выдает исключение.replaceAll с '*'

Я попробовал этот

String tmp = "M ******* k"; 

tmp = tmp.replaceAll("****","NOT"); 

System.out.println("TMP is :"+tmp); 

и я получаю это исключение

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

replaceAll Почему с * имеют такое поведение и как преодолеть эту проблему?

ответ

11

Первый аргумент в replaceAll() принимает регулярное выражение. Символ '*' имеет особое значение в регулярных выражениях.

Заменяет каждую подстроку этой строки, которая соответствует данному регулярному выражению с указанной заменой.

Таким образом, вы должны избежать этого, если вы хотите, чтобы соответствовать буквальное character '*'.

Использование "\\*".

oracle forum on the same

+2

+1 для скорости (и правильности, конечно). :) – ninetwozero

1

Попытка побега в * сек:

tmp = tmp.replaceAll("\\*\\*\\*\\*","NOT"); 
1
tmp = tmp.replace("****","NOT"); // No regular expression 
tmp = tmp.replaceAll("\\*\\*\\*\\*","NOT"); 

Второй альтернативой является регулярное выражение один.

1

Вы пытались убежать от звездочек? Как указывает PatternSyntaxException, * является специальным символом, который требует класса символов перед ним.

Более подходящий способ сделать это будет:

tmp = tmp.replaceAll("\\*\\*\\*\\*", "NOT"); 
4

Вы можете проверить этот код для справки:

public static void main (String[] args) 
    { 
      String tmp = "M ******* k"; 

      tmp = tmp.replaceAll("\\*","NOT"); 

      System.out.println("TMP is :"+tmp); 
    } 

«*» является регулярное выражение специальный символ в java.So вам нужно следовать правилам регулярных выражений.

http://docs.oracle.com/javase/tutorial/essential/regex/quant.html