我正在研究一些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+)/)) {
......但情况似乎并非如此。
答案 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+)/))
使用==~
匹配整个字符串。