如何在Groovy脚本中进行模式匹配?

时间:2017-05-31 02:26:55

标签: java regex groovy

我正在尝试在Groovy Script中进行模式匹配。我知道它是基于JAVA的。所以我尝试在JAVA中重新进行模式匹配。

我有两种模式:

1)

String a = "$ for partA?"
String b = "what is the $ for partA?"

我想将b与a匹配,因为a是b的子集。我尝试使用find(),但它返回null ...我认为这可能是因为$是一个特殊字符。

2)

String c = "the $ for partA is xx"
String d = "I know the $ for partA is $5" 

我已使用xxc.replace("xx", "\\d+(?:\\.\\d+)?|\\w+|\\W+");转换为某种模式(因为xx可以是任何内容)。但是,通过使用find(),它似乎也不适用于$ ..

我如何处理这两个问题?

2 个答案:

答案 0 :(得分:0)

基于http://docs.groovy-lang.org/2.4.0/html/api/org/codehaus/groovy/runtime/StringGroovyMethods.htmlfind()将您的a视为正则表达式。

在Java中,String有一个indexOf()方法,它只是在另一个方法中找到第一个字符串。

对于你的第二个问题,它更复杂。在你的字符串中,你需要在正则表达式中转义所有具有特殊含义的字符。我的个人建议是将a写为正确的正则表达式,或者使用indexOf将其作为普通字符串进行匹配,并单独处理结束部分。

答案 1 :(得分:0)

双引号字符串中的$具有特殊含义,因此您必须将其转义

但单引号字符串是通常的java字符串

以下是真实的:

assert 'the $ in string' == "the \$ in string"

案例1 /

String a = '$ for partA?'
String b = 'what is the $ for partA?'
assert b.endsWith(a)

String pattern = '^(what is the )?(.*) for partA\\?$'
assert a.matches(pattern)
assert b.matches(pattern)

println a.replaceAll(pattern,'$2') // $ 
println b.replaceAll(pattern,'$2') // $

assert a.replaceAll(pattern,'$2') == b.replaceAll(pattern,'$2')

案例2 /

不明白你想要什么,但要提取xx

String c = 'the $ for partA is xx'
//$ in pattern means end of line so you need to escape it
String v = c.replaceAll('^the \\$ for partA is (.*)$', '$1' )