逃离美元 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”识别为插值变量。
我无法从要与正则表达式函数一起使用的字符串中转义双美元 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”识别为插值变量。