2013-04-15 5 views
8

Я имею вопрос с заменой строки в Java ...

линии:

subject = subject.replaceAll("\\[calEvent\\]", calSubject); 

Эта линия не работает с знаком $ в calSubject.

Что такое переменная темы, динамическая переменная темы темы из файла. например, так: Calnot = [calEvent]

То, что я пытаюсь сделать, это заменить держатель места calEvent переменной объекта. но как я это сделал, это не работает, потому что он падает, когда объект содержит знак $.

любая идея, как я могу это сделать, чтобы она не сломалась, если предмет содержит знак $ или любые символы в этом отношении?

+0

Когда вы говорите, он выходит из строя, что вы имеете в виду? У вас есть трассировка стека или она просто ничего не заменяет? –

+0

Вы получаете исключение IllegalArgumentException? – Jops

+0

Ошибка: java.lang.IndexOutOfBoundsException: нет группы 3 – OakvilleWork

ответ

20

Это потому, что знак доллара является специальным символом в заменяющей строке, используйте Matcher.quoteReplacement(), чтобы избежать такого рода символов.

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject)); 

Из ИХ String.replaceAll():

Обратите внимание, что слэш (\) и знаки доллара ($) в строке замены могут вызвать результаты отличаться, чем если бы это было лечение как буквальная строка замены; см. Matcher.replaceAll. Используйте Matcher.quoteReplacement(java.lang.String) для подавления специального значения значений этих символов, если это необходимо.

Обратите внимание, что знак доллара используется для обозначения соответствующих групп захвата в регулярном выражении ($0, $1 и т.д.).

EDIT

Matcher.quoteReplacement() был введен в Java 1.5, если вы застряли в Java 1.4 вы должны бежать $ вручную, заменив его \$ внутри строки.Но так как String.replaceAll() также принимал \ и $ в качестве специальных символов, вам нужно сбежать от них один раз, и вам также придется снова избежать всех \ для среды выполнения Java.

("$", "\$") /* what we want */ 
("\$", "\\\$") /* RegExp engine escape */ 
("\\$", "\\\\\\$") /* Java runtime escape */ 

Таким образом, мы получаем:

calSubject = calSubject.replaceAll("\\$", "\\\\\\$"); 
+0

привет большое спасибо за предложение .. программа использует java 1.4, и, похоже, она не работает. трудно сказать, потому что я не могу его отлаживать локально. просто используя журналы для его решения. java 1.4 не поддерживается: Matcher.quoteReplacement? – OakvilleWork

+0

См. Мою последнюю редакцию. – zakinster

+0

Есть ли упоминание в документации по java regex, что знак доллара используется для ссылки на группы захвата? –

5

, если вам не нужны функции regex, вы можете рассмотреть возможность использования этого метода класса Струнного: replace(CharSequence target,CharSequence replacement)

Это экономит ваши «Escape» обратные косые черты, а также.

апи документ:

Заменяет каждую подстроку этой строки, которая соответствует буквальной целевой последовательности с указанной последовательностью литералов замены. Замена происходит от начала строки до конца, например, для , заменив «aa» на «b» в строке «aaa», приведет к «ba», а не «ab».

+0

Можете ли вы привести пример этого? – OakvilleWork

+1

Эта перегрузка метода 'replace()' была добавлена ​​в JDK 1.5, а OP застрял в JDK 1.4. И вы не можете использовать ['replace (char, char)'] (http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28char,%20char% 29), потому что новое значение не является одним символом. –

+0

@AlanMoore, когда я опубликовал, OP не упомянул никакой информации о 1.4. но вы правы, этот метод существует с 1.5. – Kent

2

Из документации replaceAll:

Обратите внимание, что обратная косая черта() и знак доллара ($) в строке замены может привести к результатам быть отличным, чем если бы это было , рассматриваемое как буквальная строка замены; см. Matcher.replaceAll. Используйте java.util.regex.Matcher.quoteReplacement для подавления специального значения значений этих символов, если это необходимо.

И Matcher.replaceAll

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

0

Не уверен, что я действительно понимаю ваш вопрос, но попробовать

subject = subject.replaceAll("\\[calEvent\\]", Matcher.quoteReplacement(calSubject)); 
0

Пожалуйста, используйте

Matcher.quoteReplacement(calEvent);