gko*_*lan 7 ruby regex twitter hashtag
我正在尝试使用ruby on rails为一个简单的大学项目提取主题标签.我面临的问题是只包含数字的标签和没有空格的标签.
text = "Pack my #box with #5 dozen liquor.#jugs link.com/liquor#jugs #2good #first#second"
我有的正则表达式是/(?:^|\s)#(\w+)/i(来源)
这个正则表达式返回 #["box", "5", "2good", "first"]
如何确保它只返回#["box", "2good"]并忽略其余部分,因为它们不是"真正的"主题标签?
Kas*_*ash 10
你能试试这个正则表达式:
/(?:^|\s)(?:(?:#\d+?)|(#\w+?))\s/i
更新1:
 
在某些情况下,上述正则表达式不匹配:#blah23blah和#23blah23.因此修改了正则表达式以处理所有情况.
正则表达式:
/(?:\s|^)(?:#(?!\d+(?:\s|$)))(\w+)(?=\s|$)/i
分解:
(?:\s|^) - 匹配前面的空格或行的开头.不捕捉比赛.# - 匹配哈希但不捕获.(?!\d+(?:\s|$))) - 否定前瞻以避免#和空格(或行尾)之间的所有数字字符(\w+) - 匹配并捕获所有单词字符(?=\s|$) - 正面前瞻以确保跟随空间或行尾.这是确保它匹配相邻的有效哈希标记所必需的.修改示例文本以捕获大多数情况:
#blah收拾我与#5#十几#good2白酒3good #box.#壶link.com/liquor#jugs#mkvef214asdwq SD#3E4 FLSD#2good##第一第二#3
火柴:
第1场比赛:第
2 
场比赛:第3场
比赛:第2 
场比赛4:3 比赛第5场比赛:mkvef214asdwq 
比赛6:3e4 
比赛7:2好  
更新2:
要排除以下划线开头或结尾的单词,只需在否定前瞻中包含您的排除项,如下所示:
/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/i
样本,正则表达式和匹配记录在此Rubular链接中