Regex 匹配#hashtag但不匹配#hashtag的正则表达式;(用分号)

Regex 匹配#hashtag但不匹配#hashtag的正则表达式;(用分号),regex,hashtag,Regex,Hashtag,我有当前的正则表达式: /(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)/g /(?])|^(\w*[A-Za-z|]+\w*)/g 我正在对字符串进行测试: Here's a #hashtag and here is #not_a_tag; which should be different. Also testing: Mid#hash. #123 #!@£ and <p>#hash</p> 这是一个hashtag,这是一个非hash

我有当前的正则表达式:

/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)/g
/(?])|^(\w*[A-Za-z|]+\w*)/g
我正在对字符串进行测试:

Here's a #hashtag and here is #not_a_tag; which should be different. Also testing: Mid#hash. #123 #!@£ and <p>#hash</p>
这是一个hashtag,这是一个非hashtag;这应该是不同的。同时测试:Mid#hash#123 #!@和散列

出于我的目的,在这个字符串中应该只检测到两个hashtag。我想知道如何修改表达式,使其与以
结尾的hashtag不匹配在我的示例中,这是
#而不是一个标签


干杯。

您可以使用负前瞻reegex:

/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)\b(?!;)/
/(?)|^)#(\w*[A-Za-z+\w*)\b(?)/
  • \b
    -单词边界确保我们处于单词末尾
  • (?!;)
    -声明下一个位置没有分号

以下内容如何:

\B(\#[a-zA-Z]+\b)(?!;)

  • \不是一个词的边界
  • (#[a-zA-Z]+\b)->捕获以#开头的组,后跟任意数量的a-Z或a-Z,结尾有单词边界
  • (?!;)->后面不跟
与anubhava的答案类似,但将
\w*
的两个实例替换为
\d*
,因为
\w
[A-Za-z!]
之间的唯一区别是
0-9
字符

这样可以将步骤数从588减少到90

(?)#(\d*[A-Za-z]+\d*)\b(?)

以#开头,然后至少有一个(+)ANCII符号([^\x00-\x7F],范围不包括非ANCII符号)或单词符号(\w)


这一条应涵盖包括“#їжжааааа”等ANCII符号在内的情况。这是最佳实践

(#+[a-zA-Z0-9(_)]{1,})

您可以尝试以下模式:
/\S+/


它将包括
#
之后的所有字符,空格除外。

(?你的意思是
\B
\W
需要在
#
之前有一个实际字符。接受答案的步骤最少。\B很可能是我要使用的。它与真正的散列标签#007或#50美分不匹配。性能
\B#(\d*[A-Za-z!+\w*)\b(?)
应该是您的正则表达式。
#[A-Za-z]+
不匹配
{hashtag
另外,事实证明,Safari不支持“look behind regex”。是的,它从来就不是与Safari兼容的,尽管这里有最好的答案,谢谢。如果您的软件是国际性的,唯一需要修改的可能是允许使用åççñts。可能类似于
(#+[a-zA-Z0-9A-zA-zÀ-ÖØ-ø-ʸ(Ø)1,})
不要认为你的答案是在回答OP问题:OP不想匹配分号。对于未来,最好是直接共享regex101演示/片段,而不是仅仅链接到登录页。
(?<=(\s|^))#[^\s\!\@\#\$\%\^\&\*\(\)]+(?=(\s|$))
(?<=(\s|^))#[^\s\!\@\#\$\%\^\&\*\(\)]+(?=(\s|$))