web-dev-qa-db-fra.com

extraire la sous-chaîne à l'aide d'expressions rationnelles dans groovy

Si j'ai le modèle suivant dans un texte:

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

Je voudrais extraire la partie "Hellow World", donc j'utilise le code suivant pour le faire correspondre:

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

Cependant, je continue à recevoir une exception de pointeur nul parce que l'expression régulière ne semble pas fonctionner, quelle serait l'expression correcte pour "toute paix de texte" et comment la collecter à partir d'une chaîne?

30
RicardoE

Essayer:

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

Cependant, je crains que vous envisagiez d'analyser xml avec des expressions régulières. Si ce cdata fait partie d'un document xml valide plus grand, mieux vaut utiliser un analyseur xml

44
tim_yates

Le code ci-dessous montre l'extraction de la sous-chaîne en utilisant l'expression régulière dans 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

Un peu tard pour la fête, mais essayez d'utiliser la barre oblique inverse pour définir votre modèle, par exemple:

 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'

vous étiez sur la bonne voie, c'était juste la définition du motif qui devait être modifiée.

Les références:

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

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

1
Michael Y