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

18

我有当前的正则表达式:

/(?<=[\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个回答

38

以下方案如何:

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

正则表达式演示

  • \B -> 非单词边界
  • (#[a-zA-Z]+\b) -> 以#开头,后跟任意数量的a-z或A-Z,并在末尾有一个单词边界的捕获组
  • (?!;) -> 不跟随分号

4
你是指 \B 吗?在 # 前需要有实际字符才能使用 \W - Tim Pietzcker
最少步骤的接受答案。\B 很可能是我将要使用的。 - Wex
2
它与真正的标签#007和#50cents不匹配。 - alemol
它支持非英语语言吗? - Chitrang

11

这是最佳实践。

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

2
在这里的最佳答案,谢谢。唯一可能需要修改的是如果您的软件将是国际化,则允许使用重音符号。也许可以使用类似于 (#+[a-zA-Z0-9A-Za-zÀ-ÖØ-öø-ʸ(_)]{1,}) 的东西。 - Albert Renshaw
完美,但是####标签也是有效的。更新:^#[a-zA-Z-а-яА-ЯÀ-ÖØ-öø-ʸ0-9(_)]{1,}$ - vusaldev
1
为什么这个答案将括号()作为有效的标签字符?而且为什么它允许多个类似##hashtag的标签?另外,如果简单的+就足够了,为什么要使用{1,}呢? - NicoHood

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

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

这个应该涵盖包括类似 "#їжак" 的 ASCII 符号的情况。


4
你可以使用负向先行断言正则表达式:
/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)\b(?!;)/
  • \b - 单词边界,确保我们在单词的结尾
  • (?!;) - 断言下一个位置没有分号

RegEx Demo


为了提高性能,\B#(\d*[A-Za-z_]+\w*)\b(?!;) 应该是你的正则表达式。 #[a-zA-Z]+ 无法匹配 #123hashtag - anubhava
此外,结果证明,“向后查找正则表达式”在Safari中不受支持。 - Vano
是的,没错,它从来就不是为了兼容Safari而设计的。 - anubhava

1
与anubhava的回答类似,但将两个实例的\w*换成\d*,因为\w[A-Za-z_]之间唯一的区别是0-9字符。 这样可以将步骤数从588减少到90。 (?<=[\s>])#(\d*[A-Za-z_]+\d*)\b(?!;) Regex101演示

1
你可以尝试使用这个模式:/#\S+/ 它将包括所有在#之后的字符,但不包括空格。

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

一个匹配任何标签的正则表达式代码。

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

使用说明

使用时请打开"g"和"m"标志!

它已经通过https://regex101.com和VSCode工具测试了Java和JavaScript语言。

它可以在this repo上获得。


不要认为你的答案回答了 OP 的问题:https://regex101.com/r/FFvPfn/1。OP 不想匹配分号。将来最好分享直接的 regex101 演示/片段,而不仅仅是链接到着陆页面。 - Anton Krug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接