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

问题描述 投票:6回答:3

我有当前的正则表达式:

/(?<=[\s>]|^)#(\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>

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

干杯。

regex hashtag
3个回答
14
投票

以下内容如何:

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

Regex Demo

  • \ B - >不是单词边界
  • (#[a-zA-Z] + \ b) - >捕获组以#开头,后跟任意数量的a-z或A-Z,末尾带有字边界
  • (?!;) - >没有跟着;

4
投票

你可以使用负向前瞻性正则表达式:

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

RegEx Demo


1
投票

类似于anubhava的答案,但将\w*的2个实例与\d*交换为\w[A-Za-z_]之间的唯一区别是0-9字符

这具有将步数从588减少到90的效果

(?<=[\s>])#(\d*[A-Za-z_]+\d*)\b(?!;)

Regex101 demo

© www.soinside.com 2019 - 2024. All rights reserved.