我正在为facebook编写一个hashtag scraper,我遇到的每个正则表达式都包含标点符号以及字母数字字符。这是我想要的一个例子:
你好#world!我是#m4king #fac_book scraper,想要一个很好的常规#expression。
我希望它与world
,m4king
,fac
和expression
匹配(请注意,如果它到达标点符号,我希望它会被切断,包括空格) 。如果它不包含哈希符号会很好,但它并不是非常重要。
请注意,重要的是,我将使用ruby的字符串扫描方法来获取多个标签。
提前感谢大家!
答案 0 :(得分:6)
这样的正则表达式:#([A-Za-z0-9]+)
应该与您需要的匹配并将其放在捕获组中。然后,您可以稍后访问该组。也许this将有助于揭示正则表达式(来自Ruby上下文)。
上面的正则表达式会在找到#
标记时开始匹配,并会将任何后续字母或数字抛出到捕获组中。一旦找到任何不是字母或数字的东西,它就会停止匹配。最后,您将得到一个包含您所追求的内容的小组。
答案 1 :(得分:6)
str = 'Hello #world! I am #m4king a #fac_book scraper and would like a nice regular #expression'
str.scan(/#([A-Za-z0-9]+)/).flatten #=> ["world", "m4king", "fac", "expression"]
需要调用#flatten,因为每个捕获组都在自己的数组中。
或者,您可以使用仅在'#'之后匹配字母数字字符的后视匹配:
str.scan /(?<=#)[[:alnum:]]+/ #=> ["world", "m4king", "fac", "expression"]
答案 2 :(得分:2)
这是一个更简单的正则表达式#[[:alnum:]_]/
。请注意,它包含下划线,因为Facebook目前包含下划线作为主题标签的一部分(与推特一样)。
str = 'Hello #world! I am #m4king a #fac_book scraper and would like a nice regular #expression'
str.scan(/#[[:alnum:]_]+/)
以下是Rubular的观点: http://rubular.com/r/XPPqwtVGN9