我似乎无法获得与 hashtag #
、 an@
或 word-boundary 匹配的正则表达式。目标是将字符串分解为类似 Twitter 的实体和主题,因此:
input = "Hello @world, #ruby anotherString"
input.scan(entitiesRegex)
# => ["Hello", "@world", "#ruby", "anotherString"]
要获得单词,不包括"anotherString"
太大的单词,很简单:
/\b\w{3,12}\b/
将返回["Hello", "world", "ruby"]
。不幸的是,这不包括主题标签和@
s。它似乎应该简单地与:
/[\b@#]\w{3,12}\b/
但这会返回["@world", "#ruby"]
。这让我意识到单词边界不是根据定义的字符,因此它们不属于“单个字符”的类别,因此不会匹配。更多尝试:
/\b|[@#]\w{3,12}\b/
返回["", "", "@world", "", "#ruby", "", "", ""]
。
/((\b|[@#])\w{3,12}\b)/
匹配正确的东西,但[[""], ["@"], ["#"], [""]]
按预期返回,因为大括号也意味着捕获包含的所有内容。
/((\b|[@#])\w{3,12}\b)/
种作品。它返回[["Hello", ""], ["@world", "@"], ["#ruby", "#"]]
。所以现在所有正确的项目都在那里,它们只是位于每个子数组的第一个元素处。以下代码段在技术上有效:
input.scan(/((\b|[@#])\w{3,12}\b)/).collect(&:first)
是否可以简化这一点以仅使用不需要collect
后处理的正则表达式匹配并返回正确的子字符串?