我想从字符串中提取#hashtags,也包含具有#1+1
等特殊字符的字符串。
目前我正在使用:
@hashtags ||= string.scan(/#\w+/)
但它不能与那些特殊字符一起使用。另外,我希望它与UTF-8兼容。
我该怎么做?
编辑:
如果最后一个字符是特殊字符,则应将其删除,例如#hashtag,
#hashtag.
#hashtag!
#hashtag?
等...
此外,应删除开头的哈希符号。
答案 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