2017-05-31 13 views
0

私はGroovy Scriptでパターンマッチングを試みています。私はそれがJAVAに基づいていることを知っていました。そこで、パターンマッチを行うためにJAVAのクラスを再試しました。Groovy Scriptでパターンマッチを行う方法は?

Iは、2つのパターンがあります

1)

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

Bのサブセットであるので、私は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()を使用すると、$とうまく動作しないようです。

どのようにこれらの2つの問題にアプローチできますか?

+0

グルーヴィーなマッチングのために、ここでチェック - http://mrhaki.blogspot.in/2009/09/groovy-goodness- matcher for regular.htmlと2番目の問題のために '$' – Rao

答えて

0

http://docs.groovy-lang.org/2.4.0/html/api/org/codehaus/groovy/runtime/StringGroovyMethods.htmlに基づいてfind()aを正規表現として扱います。

Javaの場合、StringにはindexOf()というメソッドがあり、別の文字列の最初の文字列が見つかります。

2番目の問題は、もっと複雑です。あなたの文字列では、正規表現で特別な意味を持つすべての文字をエスケープする必要があります。私の個人的なアドバイスは、適切な正規表現としてaを書くか、またはindexOfを使用してそれを通常の文字列としてマッチさせ、最後の部分を別々に扱います。

+0

のためにエスケープすると、私は特殊文字をエスケープするためにc.quote()を使用しようとしましたが、xxの代わりにエスケープするようです... –

+0

エスケープitまず、あなたの代理をしてください。 (私はまだそれがかなり壊れやすいと思う...) –

+0

しかし、それも同様に動作しません...それは最初の文字列に一致するようです... –

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') 
関連する問題