我正在尝试在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"
我已使用xx
将c.replace("xx", "\\d+(?:\\.\\d+)?|\\w+|\\W+");
转换为某种模式(因为xx可以是任何内容)。但是,通过使用find()
,它似乎也不适用于$
..
我如何处理这两个问题?
答案 0 :(得分:0)
基于http://docs.groovy-lang.org/2.4.0/html/api/org/codehaus/groovy/runtime/StringGroovyMethods.html,find()
将您的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' )