2013-09-26 92 views
2

注意:我不得不簡化我的實際使用情況,以備用很多背景故事。所以如果你對這個問題的第一反應是:爲什麼你會這樣做,相信我,我只需要。從Groovy表達式中雙重轉義正則表達式

我正在嘗試編寫一個Groovy表達式,它用單引號(「'」)替換出現在字符串中的雙引號(「"」)。

// BEFORE: Replace my "double" quotes with 'single' quotes. 
String toReplace = "Replace my \"double-quotes\" with 'single' quotes."; 

// Wrong: compiler error 
String replacerExpression = "toReplace.replace(""", "'");"; 

Binding binding = new Binding(); 
binding.setVariable("toReplace", toReplace); 
GroovyShell shell = new GroovyShell(binding); 

// AFTER: Replace my 'double' quotes with 'single' quotes. 
String replacedString = (String)shell.evaluate(replacerExpression); 

的問題是,我在哪裏我指定replacerExpression線得到一個編譯錯誤:令牌 「」 toReplace.replace( 「

語法錯誤」,{預期

我認爲這是因爲我需要轉義包含雙引號字符(「」「)的字符串,但由於它是一個字符串在字符串內,我不確定如何在這裏正確地轉義它。想法?提前致謝!

回答

4

你需要逃避引號內的報價在此行中:

String replacerExpression = "toReplace.replace(""", "'");"; 

的字符串將被計算兩次:一次是爲一個字符串,並一度爲腳本。這意味着你必須用反斜槓來轉義它,並且也要避免反斜槓。此外,使用嵌入式引號,如果使用三重引號,它將更具可讀性。

試試這個(在常規):

String replacerExpression = """toReplace.replace("\\"", "'");"""; 

在Java中,你堅持用反斜槓轉義所有引號和嵌入反斜線:

String replacerExpression = "toReplace.replace(\"\\\"\", \"\'\");"; 
+0

感謝@ataylor(+1),但您的建議會產生以下編譯器rrors:'多個標記在該行 \t - 賦值的左邊必須是一個變量 \t - 字符串文字不正確的關閉雙引號 \t - 語法錯誤,插入「AssignmentOperator表達式」以完成作業 \t - 語法錯誤,插入「;」完成聲明 \t - 有關令牌的語法錯誤(預期會改變) – IAmYourFaja

+0

@IAmYourFaja第二種使用'「」「'的解決方案完美無瑕,您如何運行腳本? – dmahapatro

+0

哦,我明白了,外部代碼是Java, – ataylor

1

三行情運行良好,但也可以使用單引號字符串指定雙引號,並使用雙引號字符串作爲單引號。

考慮一下:

String toReplace = "Replace my \"double-quotes\" with 'single' quotes." 

// key line: 
String replacerExpression = """toReplace.replace('"', "'");""" 

Binding binding = new Binding(); binding.setVariable("toReplace", toReplace) 
GroovyShell shell = new GroovyShell(binding) 

String replacedString = (String)shell.evaluate(replacerExpression) 

也就是說,字符串文字評估後,這是在Groovy的外殼評價:

toReplace.replace('"', "'"); 

如果太硬的眼睛,代替「 (使用斜線字符串):

String ESC_DOUBLE_QUOTE = /'"'/ 
String ESC_SINGLE_QUOTE = /"'"/ 
String replacerExpression = """toReplace.replace(${ESC_DOUBLE_QUOTE}, ${ESC_SINGLE_QUOTE});""" 
+0

謝謝@Michael Easter(+1),但是你的建議(在你寫下「Consider this:」之後)會產生下列編譯器錯誤:'這條線上的多個標記 \t - 無效的字符常量 \t - 語法錯誤,插入「;」以完成LocalVariableDeclarationStatement' – IAmYourFaja

+0

之前在「考慮這個」之後使用的行旨在放置在原始腳本中。這篇文章讓整個例子在「考慮」之後列出這個「。 –

0

請嘗試使用regular expressions來解決這類問題,而不是搞砸你的頭來解決報價的轉義問題。

我已經把一個solution使用groovy控制檯。請看看是否有幫助。