2016-07-21 50 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