42

如果我在某些文本中有以下模式:

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

我想提取“Hellow World”部分,所以我使用下面的代码来匹配它:

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

但是我不断收到空指针异常,因为正则表达式似乎不起作用,“任何文本和平”的正确正则表达式是什么,以及如何从字符串中收集它?

4

5 回答 5

64

尝试:

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

但是我担心你打算用正则表达式解析 xml。如果此 cdata 是较大的有效 xml 文档的一部分,最好使用 xml 解析器

于 2013-07-08T22:33:23.827 回答
7

下面的代码显示了在 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://git@github.com:jiahut/boot.git"
    def gitUrl2 = "git@github.com:jiahut/boot.git"
    println(stripSshPrefix(gitUrl))
    println(stripSshPrefix(gitUrl2))
  }
}
于 2018-08-02T07:32:12.963 回答
2

聚会有点晚了,但在定义模式时尝试使用反斜杠,例如:

 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

于 2019-02-25T22:24:07.123 回答
1

tim_yates 的另一种单线解决方案

def result = articleContent.replaceAll(/<!\[CDATA\[(.+)]]>/,/$1/)

请注意,如果正则表达式不匹配,则结果将等于源。不太可能的情况下

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

它会引发异常。

于 2019-10-23T13:35:49.620 回答
0

就我而言,实际的字符串是多行的,如下所示

ID : AB-223
Product : Standard Profile
Start Date : 2020-11-19 00:00:00
Subscription : Annual
Volume : 11
Page URL : null
Commitment : 1200.00
Start Date : 2020-11-25 00:00:00

我想Start Date从这个字符串中提取值,所以这就是我的脚本的样子

def matches = (originalData =~ /(?<=Actual Start Date :).*/)
def extractedData = matches[0]

此正则表达式从具有前缀匹配的每一行中提取字符串内容Start Date :

就我而言,结果是2020-11-25 00:00:00

注意:如果您originalData是多行字符串,那么在 groovy 中,您可以按如下方式包含它

def originalData = 
"""
ID : AB-223
Product : Standard Profile
Start Date : 2020-11-19 00:00:00
Subscription : Annual
Volume : 11
Page URL : null
Commitment : 1200.00
Start Date : 2020-11-25 00:00:00
"""

这个脚本看起来很简单,但我花了一些时间来弄清楚一些事情,所以我把它贴在这里。

于 2021-10-14T14:19:27.570 回答