如何为 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)
我想知道如何在 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)