逃离美元 groovy

Escaping dollars groovy

我无法从要与正则表达式函数一起使用的字符串中转义双美元 pattern/matcher。

这是字符串的一部分:

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$$”,一切正常。我错过了什么?我试过“/$”字符串,“\\”但仍然没有解决方案。

请注意,正则表达式中的 $ 匹配字符串的末尾。要将其用作文字 $ 符号,您需要使用 文字 反斜杠将其转义。

您使用的 "$$.*?$$" 被翻译成像 $$.*?$$ 这样的文字字符串,它匹配字符串的 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

任何来到这里的人都可能想知道另一个答案,如果你想使用 Groovy 斜线:

myComparisonString ==~ /.*something costs [$]stuff.*/

我找不到另一种将 $ 放在斜线字符串中的方法,至少如果 $ 后面要跟文本。相反,如果它后面跟着一个数字(或者可能是任何非字母),这将起作用:

myComparisonString ==~ /.*something costs $100.*/

...当然,问题在于 GString "compiler"(如果这是它的名称)会将“$stuff”识别为插值变量。