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

时间:2016-07-21 14:11:39

标签: regex hashtag

我有当前的正则表达式:

/(?<=[\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;

干杯。

7 个答案:

答案 0 :(得分:13)

以下内容如何:

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

Regex Demo

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

答案 1 :(得分:4)

你可以使用负向前瞻reegex:

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

RegEx Demo

答案 2 :(得分:1)

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

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

的效果

0-9

Regex101 demo

答案 3 :(得分:1)

/(#(?:[^\x00-\x7F]|\w)+)/g

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

这应该涵盖包括“#їжак”之类的ANCII符号的情况。

答案 4 :(得分:0)

这是最佳做法。

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

答案 5 :(得分:0)

你可以试试这个模式:/#\S+/

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

答案 6 :(得分:0)

(?<=(\s|^))#[^\s\!\@\#\$\%\^\&\*\(\)]+(?=(\s|$))

匹配任何主题标签的正则表达式代码。

在这种方法中,除了主符号 !@#$%^&*() 外,任何字符都可以在主题标签中接受

使用说明

使用时打开“g”和“m”标志!

它通过 https://regex101.com 和 VSCode 工具针对 Java 和 JavaScript 语言进行了测试。

它在 this repo 可用。