2014-11-14 2 views
2

У меня есть идентификатор в этом формате:Regex для GSTRING Токеном

1.5.31.14.${CHANNEL}.${SLOT} 

Это чтение из файла в виде строки, и я пытаюсь заменить $ {} лексемы с другими переменными.

Однако, когда я бегу:

id.replaceAll("\${CHANNEL}", "3") 

он будет пытаться заменить $ {CHANNEL} со значением называется

CHANNEL 

в функции и выдаст ошибку.

Я схожу с ума, пытаясь понять, что RegEx я могу использовать, чтобы заменить

${CHANNEL} and ${SLOT} 

в ID.

Если у кого-нибудь есть предложения, пожалуйста, дайте мне знать.

EDIT:

Здесь ошибка:

Exception thrown 

groovy.lang.MissingPropertyException: No such property: CARD for class: ConsoleScript91 

EDIT 2 Вот код, который я побежал:

def id = '1.5.31.14.${CHANNEL}.${SLOT}' 
id = id.replaceAll('\${CHANNEL}', '3') 
replaced = id.replaceAll('\${SLOT}', '2') 
print replaced 

Здесь ошибка:

Exception thrown 

java.util.regex.PatternSyntaxException: Illegal repetition near index 0 

${CHANNEL} 

^ 

at java_lang_String$replaceAll$1.call(Unknown Source) 

at ConsoleScript5.run(ConsoleScript5:2) 
+0

Вы пробовали размещая их в одиночные кавычки, так что они не оценивают, как GStrings? 'id.replaceAll ('\ $ {CHANNEL}'," 3 ")'? – toniedzwiedz

+0

@Tom Да, и это вызывает точно такую ​​же ошибку. –

+2

Странно, используя одинарные кавычки _should_ предотвратите это поведение. Вы уверены, что исключение выбрано в строке, где вы пытаетесь «replaceAll»? Может быть, 'toString' вызывается ранее в GString, содержащей эту последовательность символов? Это когда оцениваются GStrings. Может быть, где-то в коде, который читает файл? – toniedzwiedz

ответ

2

Вам необходимо избегать знака доллара $ и фигурных скобок {}. Имейте в виду тот факт, что \ это особый характер, так что нужно экранировать себя:

def id = '1.5.31.14.${CHANNEL}.${SLOT}' 
replaced = id.replaceAll('\\$\\{CHANNEL\\}', '3').replaceAll('\\$\\{SLOT\\}', '2') 
replaced2 = id.replaceAll(/\$\{CHANNEL\}/, '3').replaceAll(/\$\{SLOT\}/, '2') 

assert replaced == '1.5.31.14.3.2' 
assert replaced == replaced2 
+2

Или вы можете использовать slashy строки и не требовать двойной escape '/ \ $ \ {CHANNEL \} /' –

+0

@tim_yates и Opal Спасибо! Меня это так расстраивало. –

+0

Добро пожаловать. – Opal

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