问题 正则表达式(类似Twitter)标签,允许非ASCII字符


我想要一个正则表达式来匹配像twitter中那样的简单主题标签(例如#someword)。我希望它也能识别非标准字符(如西班牙语,希伯来语或中文字符)。

这是我最初的正则表达式: (^|\s|\b)(#(\w+))\b
- >但它不识别非标准字符。
然后,我尝试使用 XRegExp.js哪个有效,但跑得太慢了。

有关如何做的任何建议?


10999
2018-06-05 13:55


起源

字边界不能简单地与unicode一起使用。看到 unicode.org/reports/tr18/#Default_Word_Boundaries - Toto


答案:


最终我发现了这个: Twitter的text.js 有用的链接,这基本上是twitter如何解决这个问题。


7
2018-06-16 12:46



优秀的回购搬到了这里: github.com/twitter/twitter-text/tree/master/js 它与所有语言的列表聚合在一起: github.com/twitter/twitter-text - user1128896


对于不支持unicode的本机JS正则表达式,您唯一的选择是显式枚举可以结束标记并匹配其他所有内容的字符,例如:

> s = "foo #הַתִּקְוָה. bar"
"foo #הַתִּקְוָה. bar"
> s.match(/#(.+?)(?=[\s.,:,]|$)/)
["#הַתִּקְוָה", "הַתִּקְוָה"]

[\s.,:,] 应包括空格,标点符号和其他任何可被视为终止符号的内容。


2
2018-06-05 14:36





#([^#]+)[\s,;]*

说明:此正则表达式将搜索a # 其次是一个或多个非# 字符,后跟0或更多空格,逗号或分号。

var input = "#hasta #mañana #babהַ";
var matches = input.match(/#([^#]+)[\s,;]*/g);

结果:

["#hasta ", "#mañana ", "#babהַ"]

编辑 - 将\ b替换为字边界


1
2018-06-05 14:23



该 ? 之后 + 在尝试匹配所有非哈希字符时,只是意味着“不要太贪心”。 - itsmejodie
我不认为 \b 适用于非拉丁字符。 - georg
随着'?'它不匹配'#mañana'而没有它'#mañanababy'作为一个标签。更不用说希伯来语 - 根本不承认。 - limlim
字边界 \b 是一个零长度断言,在单词字符和非单词字符之间是真的 - Toto
正如指出的那样\ b在处理非拉丁字符时不正确。我修改了我的答案。通常,hash-tags不包含空格@limlim - itsmejodie