2017-04-12 71 views
1

我無法從字符串轉義雙美元用於正則表達式函數模式/匹配器。轉義美元

這是字符串的一部分:

WHERE oid_2 = $$test$$ || oid_2 = $$test2$$ 

,這是我一直試圖讓解附近最接近代碼:

List<String> strList = new ArrayList<String>(); 
Pattern pattern = Pattern.compile("\$\$.*?\$\$"); 
log.debug("PATTERN: "+pattern) 
Matcher matcher = pattern.matcher(queryText); 
while (matcher.find()) { 
    strList.add(matcher.group()); 
} 
log.debug(strList) 

這是調試輸出我得到

- PATTERN: $$.*?$$ 
- [] 

所以模式實際上是正確的,但在字符串中找不到佔位符。

作爲一個測試,我試圖用「XXtestXX」替換「$$ test $$」,並且一切正常。我錯過了什麼?我試過「/ $」字符串,「\\」但仍然沒有解決方案。

+0

請參閱https://ideone.com/Olm30x –

+0

「\\ $ \\ $。*?\\ $ \\ $」表示:美元符號後的非法字符串正文字符;解決方案:要麼轉義字面美元符號「\ $ 5」,要麼將值表達式「$ {5}」括在第7行第38列中。Pattern pattern = Pattern.compile(「\\ $ \\ $。*?\\ $ \\ $「)^ 1錯誤 – GiLA3

+0

雖然使用Slashy字符串它的工作原理!非常感謝,我確信我已經嘗試了這個解決方案,但不知怎的,我沒有,再次感謝! – GiLA3

回答

1

請注意,正則表達式中的$匹配字符串的末尾。要將其用作字面$符號,您需要使用文字反斜槓進行轉義。

你使用了"\$\$.*?\$\$",它被翻譯成一個字符串,如$$.*?$$,匹配字符串位置的2個末端,任何0+字符儘可能少,然後再次2個字符串結束,這沒什麼意義。您實際上需要一個反斜槓來首先轉義用於Groovy的$以將變量注入到雙引號字符串文字中,然後使用2個反斜槓來定義文字反斜槓 - "\\\$\\\$.*?\\\$\\\$"

但是,當您使用正則表達式時,斜槓字符串非常有用,因爲您需要轉義特殊字符的所有字符都是單個反斜槓。

這裏是一個示例代碼提取用Groovy有字符串的所有匹配:

def regex = /\$\$.*?\$\$/; 
def s = 'WHERE oid_2 = $$test$$ || oid_2 = $$test2$$' 
def m = s =~ regex 
(0..<m.count).each { print m[it] + '\n' } 

online demo

+0

如果我爲每個具有相同名稱的佔位符都有一個變量會怎麼樣,我將如何替換它中的值?例如,我有String test =「1」和String test2 =「2」,將所有$$ test $$替換爲「1」並將所有$$ test2 $$替換爲「2」的最簡單方法是什麼?我希望這個要求很明確 – GiLA3

+0

你的意思是你需要用它們的值替換變量(通過名字)?不是[這樣的東西?](https://ideone.com/mBpDWO) –

+0

如果你有他們在一個字符串內,然後使用[這樣的事情](https://ideone.com/tmdGut)。 –