逃离美元时髦

GiL*_*LA3 5 regex groovy placeholder

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

这是字符串的一部分:

WHERE oid_2 = $$test$$ || oid_2 = $$test2$$
Run Code Online (Sandbox Code Playgroud)

这是我尝试接近解决方案的最接近的代码:

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)
Run Code Online (Sandbox Code Playgroud)

这是我得到的调试输出

- PATTERN: $$.*?$$
- []
Run Code Online (Sandbox Code Playgroud)

所以模式实际上是正确的,但在字符串中找不到占位符。

作为测试,我尝试将“$$test$$”替换为“XXtestXX”,一切正常。我缺少什么?我尝试过“/$”字符串,“\\”但仍然没有解决方案。

Wik*_*żew 6

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

你使用"\$\$.*?\$\$"它被翻译成一个文字字符串,就像$$.*?$$匹配字符串位置的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' }
Run Code Online (Sandbox Code Playgroud)

请参阅在线演示。