我正在尝试使用 ruby on Rails 为一个简单的大学项目提取主题标签。我面临着仅包含数字的标签和没有空格的标签的问题。
text = "Pack my #box with #5 dozen liquor.#jugs link.com/liquor#jugs #2good #first#second"
我的正则表达式是/(?:^|\s)#(\w+)/i
(source https://stackoverflow.com/questions/1796763/regular-expression-to-match-a-pattern-either-at-the-beginning-of-the-line-or-aft)
这个正则表达式返回#["box", "5", "2good", "first"]
如何确保它只返回#["box", "2good"]
并忽略其余部分,因为它们不是“真正的”主题标签?
你能试试这个正则表达式吗:
/(?:^|\s)(?:(?:#\d+?)|(#\w+?))\s/i
更新1:
在某些情况下,上述正则表达式不会匹配,例如:#blah23blah 和 #23blah23。
因此修改了正则表达式来处理所有情况。
Regex:
/(?:\s|^)(?:#(?!\d+(?:\s|$)))(\w+)(?=\s|$)/i
分解:
-
(?:\s|^)
--匹配前面的空格或行首。才不是
捕捉比赛。
-
#
--匹配哈希但不捕获。
-
(?!\d+(?:\s|$)))
--负向预测以避免所有数字字符
# 和空格(或行尾)之间
-
(\w+)
--匹配并捕获所有单词字符
-
(?=\s|$)
--正向前视以确保以下空格或结尾
线。这是为了确保它与相邻的有效哈希标签匹配所必需的。
修改示例文本以捕获大多数情况:
#blah 在我的#盒子里装上#5打#good2 #3好酒。#jugs
link.com/liquor#jugs #mkvef214asdwq sd #3e4 flsd #2good #first#second #3
Matches:
第1场比赛:废话
比赛2:盒子
比赛3:好2
第 4 场比赛:3 好
比赛 5:mkvef214asdwq
比赛 6: 3e4
第 7 场比赛:2 好
红柱状链接 http://www.rubular.com/r/MD6avgvV05
更新2:
要排除以下划线开头或结尾的单词,只需将排除项包含在否定前瞻中,如下所示:
/(?:\s|^)(?:#(?!(?:\d+|\w+?_|_\w+?)(?:\s|$)))(\w+)(?=\s|$)/i
样本、正则表达式和匹配记录在此红柱状链接 http://www.rubular.com/r/PySQB8NvUY
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)