从字符串中提取用户定义的Groovy标记

时间:2016-10-13 16:17:23

标签: regex groovy

Groovy:我需要扫描字符串以获取表单的子字符串:

${token}:<someValue>]

那是:

  • 用户定义(动态)token字符串(可以是运行时的任何内容);然后
  • 冒号(:);然后
  • 任何事情(<someValue>);最后
  • 右方括号(]

所以基本上是这样的:

def String fetchTokenValue(String toScan, String token) {
    if(toScan.matches(".*${token}:.*]")) {
        String everythingBetweenColonAndRBracket = ???
        return everythingBetweenColonAndRBracket
    } else {
        return 'NO_DICE'
    }
}

这样输出如下:

fetchTokenValue('swkokd sw:defroko swodjejr blah:fizzbuzz] wdkerko', 'blah') => 'fizzbuzz'
fetchTokenValue('swkokd sw:defroko swodjejr blah:fizzbuzz] wdkerko', 'boo') => 'NO_DICE'

我正在努力学习正则表达式,以及如果匹配,如何在冒号和右方括号之间提取所有文本。我们可以假设只会有一个匹配,或者只是对找到的第一个匹配进行操作(如果存在)。

我出错的任何想法?

2 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式将一个var s = Snap("#MyPopup"); var image = null; var mImagePath = "https://myimages.com/xyz.png"; if ( imageExists (mImagePath) == true ) { image = s.image(mImagePath, 250, 10, 40,40 ); } else { image = s.image("https://myimages.com/ImageNotFound.png", 250, 10, 40,40 ); } function imageExists(image_url){ var http = new XMLHttpRequest(); http.open('HEAD', image_url, false); http.send(); return http.status == 200; } 内的任何内容抓取到一个组

]

答案 1 :(得分:1)

您可以使用def String fetchTokenValue(String toScan, String token) { def match = toScan =~ /.+${token}:([^\]]+)/ if(match) { match[0][1] } else { 'NO_DICE' } } def str = 'swkokd sw:defroko swodjejr blah:fizzbuzz] wdkerko' assert fetchTokenValue(str, 'blah') == 'fizzbuzz' assert fetchTokenValue(str, 'boo') == 'NO_DICE' 子模式(一个否定的字符类[^\]]*来匹配除其中定义的字符之外的任何字符)来匹配除[^...]之外的零个或多个字符并使用捕获group捕获该文本并仅返回Group 1内容。此外,最好自动转义输入令牌,以避免非法的模式语法问题:

]

请参阅online Groovy demo