2012-02-14 3 views
2

У меня есть список строк, содержащих токены.
токена:Как заменить скобки в строках

{ARG:token_name}.

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

Когда я использую "replaceAll" метод, который я получаю ошибку:

java.util.regex.PatternSyntaxException: Illegal repetition

Мой код является чем-то вроде этого:

myStr.replaceAll(valueFromHashMap , "X"); 

и valueFromHashMap содержит {и}.

Я получаю этот hashmap в качестве параметра.

+2

Разместите код, чтобы мы могли понять, что это неправильно –

ответ

5

Как уже говорилось, { - специальный символ, используемый в шаблоне (}). Вам нужно избегать этого, чтобы избежать путаницы.

Экипаж этих вручную может быть опасным (вы можете опустить его и сделать свой рисунок полностью неправильным) и утомительным (если у вас много специальных символов). Лучший способ борьбы с этим является использование Pattern.quote()


Похожие вопросы:

Ресурсы:

6

String.replaceAll() работает с регулярными выражениями. {n,m} обычно повторяется в регулярных выражениях.

Попробуйте использовать \\{ и \\}, если вы хотите совместить литературные скобки.

Так замена всех открывающих скобок на X работает таким образом:

myString.replaceAll("\\{", "X"); 

См here читать о регулярных выражениях (Regexps) и почему { и } специальные символы, которые должны быть экранированы при использовании регулярных выражений.

+0

, так что я бы iterrate ключи HashMap, определить, содержит ли ключ {или} и добавить к нему косую черту? – omrid

+0

Нет, метод 'String.replaceAll()' использует регулярные выражения. Эти регулярные выражения имеют какие-то специальные символы (например, {и}). В качестве примера «a {5,7}» означает «от 5 до 7» a в строке »(aaaaa, aaaaaa или aaaaaaa). Я ожидал, что вы попробуете что-то вроде 'myStr.replaceAll (" {"," X ")', но '{' не является допустимым регулярным выражением. Поэтому мой намек: просто замените '{' '' \\ {'и'} 'на' \\} 'в первом параметре' String.replaceAll() '. –

+0

Johannes Weiß, вы правы. Я использую myStr.replaceAll (valuefromhashmap, «X»), а valueFromHashMap - «{». Я получаю этот хэш-файл в качестве параметра. Что мне делать? заменить все элементы в hashmap? – omrid

1

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

0

Вы можете удалить фигурные скобки с .replaceAll() в соответствии с квадратными скобками

String newString = originalString.replaceAll("[{}]", "X")

например: NewString = "ARG: TOKEN_NAME"

если вы хотите дополнительно разделить newString на ключ и значение, вы можете использовать .split()

String[] arrayString = newString.split(":")

С arrayString, вы можете использовать его для HashMap с .put(), arrayString[0] и arrayString[1]

Смежные вопросы