Groovy字符串替换

时间:2015-03-07 04:33:59

标签: regex replace groovy

我正在研究一些Groovy代码来获取文本,这些文本意味着是一个推文,并将所有主题标签转换为指向Twitter主题标签的网页链接。实际上,我的代码工作正常,但是当文本中只有#时,它会被视为“数字符号”而不是主题标签时会失败。

工作(边缘情况除外)代码是:

static replaceHashTags(input) {
    while (input.contains(/#/)) {
        input = input.replaceAll(/(.*)#(\w+)(.*)/, { all, before, hashtag, after ->
            "${before}<a href='https://twitter.com/hashtag/${hashtag}'>${hashtag}</a>${after}"
        })
    }

    input.replaceAll(/<a href='https:\/\/twitter.com\/hashtag/, '#<a href=\'https://twitter.com/hashtag')
}

在我找到解决方案之前,我没有打破大多数工作代码,而是编写了一个测试类来试用我的新匹配代码。它失败了,我无法弄清楚原因。这是测试类:

class StringTest {
    def checkContains(string, expression) {
        string.contains(expression)
    }

    @Test
    void shouldTestSomethingElse() {
        assert (checkContains('This is a string', /is/)) // Passes
        assert !(checkContains('This is a string', /werigjweior/)) // Passes

        assert (checkContains('#This tweet starts with a hashtag', /#This/)) // Passes
        assert (checkContains('#This tweet starts with a hashtag', /#(\w+)/)) // Fails.
    }
}

正如我所说,我不确定为什么最后assert失败了。我对此练习的期望是,我可以简单地用while (input.contains(/#/)) {替换while (input.contains(/#(\w+)/)) { ......但情况似乎并非如此。

1 个答案:

答案 0 :(得分:1)

我不相信string.contains()接受正则表达式作为论据。这对我有用:

def checkContains(string, expression) {
  string =~ expression
}

assert (checkContains('This is a string', /is/))
assert !(checkContains('This is a string', /werigjweior/))
assert (checkContains('#This tweet starts with a hashtag', /#This/))
assert (checkContains('#This tweet starts with a hashtag', /#(\w+)/))

使用==~匹配整个字符串。