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

Regular Expression to match #hashtag but not #hashtag; (with semicolon)

我有当前的正则表达式:

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

干杯。

您可以使用负前瞻 reegex:

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

RegEx Demo

下面的怎么样:

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

Regex Demo

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

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

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

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

Regex101 demo

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

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

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

这是最佳做法。

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

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

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

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

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

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

使用说明

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

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

this repo.

有售