如何将UTF-8编码的主题标签与嵌入的标点字符匹配?

时间:2012-06-05 13:43:28

标签: ruby regex hashtag

我想从字符串中提取#hashtags,也包含具有#1+1等特殊字符的字符串。

目前我正在使用:

@hashtags ||= string.scan(/#\w+/)

但它不能与那些特殊字符一起使用。另外,我希望它与UTF-8兼容。

我该怎么做?

编辑:
如果最后一个字符是特殊字符,则应将其删除,例如#hashtag, #hashtag. #hashtag! #hashtag?等...

此外,应删除开头的哈希符号。

3 个答案:

答案 0 :(得分:1)

解决方案

您可能需要以下内容:

'#hash+tag'.encode('UTF-8').scan /\b(?<=#)[^#[:punct:]]+\b/
=> ["hash+tag"]

请注意,开始时需要零宽度断言,以避免在匹配过程中捕获井号。

参考

答案 1 :(得分:0)

这个怎么样:

@hashtags ||=string.match(/(#[[:alpha:]]+)|#[\d\+-]+\d+/).to_s[1..-1]

照顾#alphabets或#2323 + 2323#2323-2323#2323 + 65656-67676

同时删除#开头的

或者如果你想要它的数组形式:

 @hashtags ||=string.scan(/#[[:alpha:]]+|#[\d\+-]+\d+/).collect{|x| x[1..-1]}

哇,这花了这么长时间,但我仍然不明白为什么scan(/#[[:alpha:]]+|#[\d\+-]+\d+/)在我的电脑中工作但不在scan(/(#[[:alpha:]]+)|#[\d\+-]+\d+/)。区别在于第二个扫描语句中的()。当我使用match方法时,这没有任何效果。

答案 2 :(得分:0)

这应该有效:

@hashtags = str.scan(/#([[:graph:]]*[[:alnum:]])/).flatten

或者,如果您不希望您的主题标签以特殊字符开头:

@hashtags = str.scan(/#((?:[[:alnum:]][[:graph:]]*)?[[:alnum:]])/).flatten