2017-02-20 74 views
1

我想更正自動創建的Linux腳本。我使用findAll(String, String)函數來更改"$APP_ARGS"以進行其他操作。如何在Groovy中找到帶有美元符號的雙引號字符串的子字符串

我已經試過變種:

replaceAll('"$APP_ARGS"', 'simulators ' + '"\\\\$APP_ARGS"') - doesn't find 
replaceAll('\"\$APP_ARGS\"',... - doesn't find 
replaceAll('"\$APP_ARGS"',... - doesn't find 
replaceAll('\\"\\$APP_ARGS\\"',... - editor warning - excessive escape 
replaceAll('"\\\\$APP_ARGS"',... - doesn't find 
replaceAll('\\\\"\\\\$APP_ARGS\\\\"',... - doesn't find 
replaceAll($/"$$APP_ARGS"/$, ...) - does not find 
replaceAll('"[$]APP_ARGS"', 'something simple')  - finds. 
replaceAll('"[$]APP_ARGS"', '"\\\\$APP_ARGS"')  - fails. 

正如你看到的,如果我用正則表達式格式,這一發現工程確定。但是有沒有辦法做出逃避的工作?因爲我在替換字符串中也需要$

根據Groovy手冊,/../字符串不需要轉義任何東西,除了斜槓自己。但是

replaceAll(/"$APP_ARGS"/,... 

也會失敗,並顯示以下消息:無法獲取未知屬性'APP_ARGS'。

似乎該功能的行爲沒有邏輯,我們必須通過實驗找到正確的解決方案。

+0

您正在爭奪GStrings和RegExp一次。如果只使用'replace',則可以使用單引號字符串,而不必在正則表達式中處理引號。例如''ls $ ARGS'.replace('$ ARGS',「-l」)' – cfrick

+0

我相信你如果不是第二個參數的問題,那就是純String。第一個參數BTW也是String類型,而不是Pattern。這就是我所說的:第一個參數被聲明爲String,但是作爲Pattern--部分。沒有邏輯。 – Gangnus

+0

這與第二個參數無關,除非你正在嘗試某些東西,這在你的問題中並不清楚。請嘗試''ls'$ ARGS''。replace(''$ ARGS'','-l'$ ARGS'')'如果這不符合您的期望,請詳細說明。 'replaceAll'需要一個正則表達式作爲第一個參數(並且將把你的字符串變成一個)。 – cfrick

回答

1
replaceAll('"\\$APP_ARGS"', 'simulators ' + '"\\$APP_ARGS"') 

附加可能的問題是\\之前$應該是在兩個字符串,替換和代替。

replaceAll的第一個參數總是被視爲正則表達式,因此我們需要引用$(行結束)。第二個參數可能包含來自正則表達式的組的反向引用,這些引用以$開頭,因此也必須引用其中的引用。

更好的方法是使用replace而不是replaceAll,它已根據該用法引用/轉義兩個參數。

相關問題