2017-04-12 105 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)。 –