我正在尝试解码一些 groovy 脚本。我能够弄清楚它是一个正则表达式,但无法弄清楚代码到底是什么。
def dirNumber = this.'Directory Number'
dirNumber?"61" + (dirNumber =~ /0([0-9]+)/)[0][1] + "@":null
我正在尝试解码一些 groovy 脚本。我能够弄清楚它是一个正则表达式,但无法弄清楚代码到底是什么。
def dirNumber = this.'Directory Number'
dirNumber?"61" + (dirNumber =~ /0([0-9]+)/)[0][1] + "@":null
根据https://groovy-lang.org/operators.html的正则表达式运算符部分,是find 运算符,它在右侧创建一个for 模式,将它们与左侧的字符串匹配。因此,等价于
并计算为 的实例。=~
java.util.regex.Matcher
dirNumber =~ /0([0-9]+)/
Pattern.compile("/0([0-9]+)/").matcher(dirNumber)
java.util.regex.Matcher
Groovy 使您能够通过索引([0]
在您的代码中)访问匹配项;您的正则表达式使用grouping,因此在每个匹配项中,您也可以通过(1-based:0 表示整个模式)索引([1]
在您的代码中)访问组。
因此,您的代码(如果dirNumber
不是null
)提取正则表达式的第一个匹配项的第一组。
// 已编辑
IndexOutOfBoundsException
当第一个索引([0]
在您的代码中)超出匹配范围时,您可以获得一个;当您的第二个索引([1]
在您的代码中)在 grous 范围内时,您将null
毫无例外地通过索引访问组...
您可以使用上述代码的简化版本来测试这些场景:
def dirNumber = "Xxx 15 Xxx 16 Xxx 17"
def matcher = dirNumber =~ /Xxx ([0-9]+)/
println(matcher[0][1]) // 15
println(matcher[0][5]) // null
println(matcher[5][1]) // IndexOutOfBoundsException