web-dev-qa-db-ja.com

groovyで正規表現を使用して部分文字列を抽出する

テキストに次のパターンがある場合:

def articleContent =  "<![CDATA[ Hellow World ]]>"

「Hellow World」部分を抽出したいので、次のコードを使用して一致させます。

def contentRegex = "<![CDATA[ /(.)*/ ]]>"
def contentMatcher = ( articleContent =~ contentRegex )
println contentMatcher[0]

しかし、正規表現が機能していないように見えるので、nullポインタ例外を取得し続けます。「テキストの平和」の正しい正規表現は何でしょうか。

30
RicardoE

試してください:

def result = (articleContent =~ /<!\[CDATA\[(.+)]]>/)[ 0 ]​[ 1 ]

ただし、XMLを正規表現で解析する予定があるのではないかと心配しています。このcdataがより大きな有効なxmlドキュメントの一部である場合、xmlパーサーを使用する方が良い

44
tim_yates

以下のコードは、groovyで正規表現を使用した部分文字列抽出を示しています。

class StringHelper {
@NonCPS
static String stripSshPrefix(String gitUrl){
    def match = (gitUrl =~ /ssh:\/\/(.+)/)
    if (match.find()) {
        return match.group(1)
    }
    return gitUrl
  }
static void main(String... args) {
    def gitUrl = "ssh://[email protected]:jiahut/boot.git"
    def gitUrl2 = "[email protected]:jiahut/boot.git"
    println(stripSshPrefix(gitUrl))
    println(stripSshPrefix(gitUrl2))
  }
}
4
jiahut

パーティーに少し遅れましたが、パターンを定義するときにバックスラッシュを使用してみてください、例:

 def articleContent =  "real groovy"
 def matches = (articleContent =~ /gr\w{4}/) //grabs 'gr' and its following 4 chars
 def firstmatch = matches[0]  //firstmatch would be 'groovy'

あなたは正しい軌道に乗っていたので、変更する必要があるのはパターン定義だけでした。

参照:

https://www.regular-expressions.info/groovy.html

http://mrhaki.blogspot.com/2009/09/groovy-goodness-matchers-for-regular.html

1
Michael Y