Regex 如何匹配多种语言

Regex 如何匹配多种语言,regex,go,unicode,Regex,Go,Unicode,我正在golang中编写一个正则表达式来捕获可能以不同语言出现的hashtag。例如,显而易见的是英语,但可能有拉丁或阿拉伯语用户会尝试使用这些字符集创建哈希标记。 我知道unicode字符类名,但是如何一次使用多个字符而不为每个字符生成正则表达式呢 示例代码: r, err := regexp.Compile(`\B(\#[[:ascii:]]+\b)[^?!;]*`) 这将匹配“#helloŦوق”,并输出[]字符串{hello,Ŧhello,Ŧ1608;ق},但不能仅匹配“Ŧ1584;و

我正在golang中编写一个正则表达式来捕获可能以不同语言出现的hashtag。例如,显而易见的是英语,但可能有拉丁或阿拉伯语用户会尝试使用这些字符集创建哈希标记。 我知道unicode字符类名,但是如何一次使用多个字符而不为每个字符生成正则表达式呢

示例代码:

r, err := regexp.Compile(`\B(\#[[:ascii:]]+\b)[^?!;]*`)
这将匹配
“#helloŦوق”
,并输出
[]字符串{hello,Ŧhello,Ŧ1608;ق}
,但不能仅匹配
“Ŧ1584;وق”
,我建议使用

\B#[\p{L}\p{N}\p{M}_]+
其中,
[\p{L}\p{N}\p{M}\u]
大致是支持Unicode的
\w
模式。
\p{L}
匹配任何单字字母,
\p{M}
匹配任何组合标记,
\p{N}
匹配任何Unicode数字

见:

输出:

#hello
#ذوق
使用
文本:=“#ذوق”
#وق


请参阅。

您的正则表达式与#dé范围不匹配,因为锐重音是一个标记\p{M}而不是一个字母。将正则表达式更改为
\B\[\p{L}\p{N}\p{N}\p{M}\u*
@JGNI可能,这种简洁性是不必要的,而且
\B{N}\p{L}\p{N}\p{M}+
就足够了。如果只需要在字母后匹配变音符号,则该模式看起来像
\B#(?:\p{L}\p{M}*.[\p{N}}}+
。如果要求在
之后只有一个字母,那么它看起来就像
\B{L}\p{M}*(?:\p{L}\p{M}*.[\p{N}}}]*
。等等等等。
#hello
#ذوق