如何为 groovy 中的任何字符编写通配符

How to write wildcards for any character in groovy

我想知道如何在 groovy 脚本中应用通配符?例如,而不是像这样的长列表:

def name1 = 'name1'
def name2 = 'name2'
def name3 = 'name3'

如果字符串可以是这些名称中的任何一个,我会很高兴,所以我不介意它是 1,2 还是 3,只要它在 'name' 之后有一个字符就可以了。这意味着我可以有一个变量,如:

def name = 'name' + wildcard

有点像 sql,如果你想搜索像名字这样的东西,你只需要任何东西开始,你会写 LIKE 'name%'.

谢谢

更新:

我有三个变量:

def ns4 = 'ns4:testResponse'
def ns3 = 'ns3:testResponse'
def ns2 = 'ns2:testResponse'

但是我想为任何 ns 测试标签设置一个变量,所以我尝试了这个:

def ns = 'ns' +/[\d]+/':testResponse'

但是我得到一个 Script36.groovy: 17: expecting EOF, found ':testResponse'

我也试过def ns = 'ns' +/[\d]+/+':testResponse'但是当我在 ns2 和 ns 之间执行断言时我得到这个:

assert ns2 == ns | | | | | ns[\d]+:testResponse | false ns2:testResponse

实际上我不想像这样提供多个 if 语句:

if (response.contains(ns2)...
else if (response.contains(ns3)..
else if (response.contains(ns4) etc

实际上我对两者中的数字都不在意:

def ns4 = 'ns4:testResponse'
def ns3 = 'ns3:testResponse'
def ns2 = 'ns2:testResponse'

所以我想实现一个通配符而不是数字,这样我就可以只有一个 def 变量和一个 if 语句,而不是 3 个 def 变量和 3 个 if 语句。

所以我想改变这个:

    def ns4 = 'ns4:testResponse'
    def ns3 = 'ns3:testResponse'
    def ns2 = 'ns2:testResponse'

...

    if (response.contains(ns2)...
    else if (response.contains(ns3)..
    else if (response.contains(ns4) etc

变成这样的东西:

def ns = 'ns' +/[\d]+/':testResponse'

...

if (response.contains(ns)

响应示例:

<SOAP-ENV:Body>
      <ns5:testResponse>
      </ns5:testResponse>
   </SOAP-ENV:Body>

所以在上面的回复中,你可以看到我有一个标签,上面写着:<ns5:testResponse

但是根据请求,此标签中的数字可以更改,它可以是:

<ns3:testResponse
<ns4:testResponse
<ns5:testResponse
<ns6:testResponse
<ns7:testResponse

现在,如果响应包含:<ns3:testResponse<ns4:testResponse 或此 <ns5:testResponse 等,而不是使用 if 语句,

我只想确保它包含标签 <ns*:testResponse,其中星号是任意数字,因此它可以匹配上述 5 个标签中的任何一个

为了在正则表达式中识别数字,使用\d。如果您期望多于一位数,则使用 \d+.

这是示例脚本:

def list = ['name1','name2', 'name10a']
def pattern = /name[\d]+/
list.collect { assert it ==~ pattern }

如果您查看列表,最后一个元素的模式不同,因为它在两位数字后有 个字符

输出:

groovy> def list = ['name1','name2', 'name10a'] 
groovy> def pattern = /name[\d]+/ 
groovy> list.collect { assert it ==~ pattern } 

Exception thrown

Assertion failed: 

assert it ==~ pattern
       |  |   |
       |  |   name[\d]+
       |  false
       name10a

    at ConsoleScript5$_run_closure1.doCall(ConsoleScript5:3)
    at ConsoleScript5.run(ConsoleScript5:3)