2016-07-21 49 views
3

我目前正则表达式:正则表达式匹配#hashtag而不是#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 #[email protected]£ and <p>#hash</p> 

对于我而言,应该只有在这串检测到两个主题标记。我不知道如何改变的表达,使得它匹配井号标签与在我的例子一个;这到底是#not_a_tag;

干杯。

回答

5

如何执行以下操作:

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

Regex Demo

  • \乙 - >不是一个字边界
  • (#[A-ZA-Z] + \ B) - >捕获组开始与#后面跟着任意数量的az或AZ,并在末尾有一个字边界
  • (?!;) - >不跟随;
+4

您的意思是'\ B'? '\ W'需要在'#'之前出现一个实际的字符。 –

+0

接受答案的最少步骤。 \ B可能是我将要使用的。 – Wex

+0

@TimPietzcker你说得对。发布编辑。 – tk78

4

可以使用负前瞻reegex:

/(?<=[\s>]|^)#(\w*[A-Za-z_]+\w*)\b(?!;)/ 
  • \b - 单词边界保证了我们在字
  • (?!;)末 - 断言,我们没有在接下来的分号位置

RegEx Demo

+0

对于性能'\ B#(\ d * [A-Za-z _] + \ w *)\ b(?!;)'应该是您的正则表达式。 '#[a-zA-Z] +'不会匹配'#123hashtag' – anubhava

1

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

是减少了步数从588到90

效果

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

Regex101 demo