正则表达式使用ruby匹配句子中的主题标签

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"
Run Code Online (Sandbox Code Playgroud)

我有的正则表达式是/(?:^|\s)#(\w+)/i(来源)

这个正则表达式返回 #["box", "5", "2good", "first"]

如何确保它只返回#["box", "2good"]并忽略其余部分,因为它们不是"真正的"主题标签?

Kas*_*ash 10

你能试试这个正则表达式:

/(?:^|\s)(?:(?:#\d+?)|(#\w+?))\s/i
Run Code Online (Sandbox Code Playgroud)

更新1:
在某些情况下,上述正则表达式不匹配:#blah23blah和#23blah23.因此修改了正则表达式以处理所有情况.

正则表达式:

/(?:\s|^)(?:#(?!\d+(?:\s|$)))(\w+)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)

分解:

  • (?:\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好

Rubular链接

更新2:

要排除以下划线开头或结尾的单词,只需在否定前瞻中包含您的排除项,如下所示:

/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/i
Run Code Online (Sandbox Code Playgroud)

样本,正则表达式和匹配记录在此Rubular链接中