一般表示式:在groovy中的replaceAll()函数中组合两个正则表达式

vmdwslir  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(50)

我有一些测试数据,看起来如下:
test_ids = [test_data_123, test_123, test_data_456]
我试图将它们传递到Groovy的replaceAll()方法中,该方法将上述数组中的所有元素转换为字符串。
${__groovy(vars.get('test_ids').replaceAll(/\b((test_\d+)||(test_data_\d+))\b/) { match\, number -> "\"$number\"" },)}
下面是我正在使用的正则表达式:
(test_\d+)||(test_data\d+)
这好像不管用。有没有人能提供一个正则表达式来选择所有的元素?

qhhrdooz

qhhrdooz1#

所以问题是List(即[“something here”])不理解replaceAllreplaceAll是String上的一个方法(即“something here”)。因此,您需要在List上循环并调用replaceAll。
但是,这里有一点我不明白你的问题,这段代码的意义是什么?目前还不清楚你为什么要这样做,所以我认为如果我们明白,我们可以提供更好的帮助,让你得到你想要的,并试图以更直接,更容易理解的方式完成。但是,我只想尝试完成我认为你想要的。

test_ids = ['test_data_123', 'test_123', 'test_data_456', 'fjkfkd']

println( test_ids.collect { 
    it.replaceAll(/\b(test_\d+)|(test_data_\d+)\b/) { match -> 
       int number = match[1..-1].findIndexOf { it } + 1
       "\"$number\""
    }
})

这将返回打印以下内容:

["2", "1", "2", fjkfkd]

所以它返回它匹配的正则表达式的索引号。这将是group number。因此,在您提供的输入中,列表的第一项(test_data_123)匹配第二组(即2),第二项(test_123)返回第一组(即1)。第三个和第一个一样(test_data_456),所以是2。但是最后一项不匹配任何东西,所以没有任何东西被替换,它只是返回给定的String。这不在您的示例输入中,但如果没有匹配的内容会发生什么?在你的算法中要考虑的东西。
第一个变化是删除number作为闭包的参数,因为传递给闭包的唯一参数是匹配组数组(即match)。第一项是这样的:[ "test_data_123", null, "test_data_123" ],第二个["test_123", "test_123", null]。x1m1.. -1n1x返回不是第0个元素(即[1.. -1])的索引,并且是非空的。
另一个变化是从正则表达式中删除||,并将其替换为|||不是正则表达式中的一个东西。如果你想要模式A或模式B,它是A|B
有几件事要问。replaceAll是正确的工具吗?我假设您想知道每个字符串匹配哪个正则表达式。但是因为你使用的是replaceAll,你必须返回一个String。但是,你只想知道它是模式1还是模式2。所以我可能会这样做:

println(test_ids.collect { s ->
   if( s.matches(~/\btest_\d+\b/) ) return 1
   if( s.matches(~/\btest_data_\d+\b/) ) return 2
   return -1
})

然后就很容易弄清楚,并使用整数数学来知道哪个是哪个。

相关问题