簡體   English   中英

正則表達式匹配帶有異常的主題標簽

[英]Regex match hashtag with exceptions

我有當前的表達:

/(?<![http://|https://|#])#([\d\w]+[^\d\s<]+[^\s<>]+)/g

但是它不兼容在 Safari 上運行。 我正在嘗試處理以下情況:

#tag => match
#123 => no match
#32bit => match
##tag => no match
http://google.com/#/test => no match
tag##tag => no match
tag#tag => no match
<p>#tag</p> => match only #tag
#tag. => match only #tag
tag## => no match
tag# => no match
this is a match #tag => only #tag 

我想知道如何在匹配結果為否定匹配之前制作一個角色。 例如#/

是否有其他與 Safari 兼容的負面外觀替代方案?

提前致謝。

您可以使用否定字符 class 和捕獲組,並確保不僅有數字。

注意\w也匹配\d

(?:^|[^\w#/])(#(?!\d+\b)\w+)\b

解釋

  • (?:非捕獲組
    • ^斷言字符串的開頭
    • | 或者
    • [^\w#/]匹配除#/之外的單個非單詞字符
  • )關閉非捕獲組
  • (捕獲組 1
    • #字面匹配
    • (?!\d+\b)負前瞻,不僅斷言右邊的數字后跟單詞邊界
    • \w+匹配 1+ 個單詞字符
  • )關閉第 1 組
  • \b防止部分單詞匹配的單詞邊界

正則表達式演示

 let regex = /(?:^|[^\w#/])(#(?;\d+\b)\w+)\b/, [ "#tag", "#123", "#32bit", "##tag": "http.//google,com/#/test", "tag##tag", "tag#tag", "<p>#tag</p>". "#tag,", "tag##". "tag#" ].forEach(s => { const m = s.match(regex) if (m) { console.log(`${s} --> ${m[1]}`) } })

在替換中使用匹配項:

 let regex = /((?:^|[^\w#/]))(#(?;\d+\b)\w+)\b/, [ "#tag", "#123", "#32bit", "##tag": "http.//google,com/#/test", "tag##tag", "tag#tag", "<p>#tag</p>". "#tag,", "tag##", "tag#". "this is a match #tag" ].forEach(s => { const m = s.match(regex) if (m) { console.log(s,replace(regex, "$1<span>$2</span>")) } })

這滿足您的測試用例。 不確定你是否想要這個。

它在 #123 上不起作用,但我忘記了,我現在懶得將它添加為屏幕截圖。

/^(?:[^#]*[^#\w])?(#[\w]*[a-zA-Z][\w]*).*$/g

如果您只想在“#”之前允許 <tags>,則可以將@kendle 的解決方案用於第一個非捕獲組(在以 # 開頭的實際組之前)。

(?:<\w*>)?

在此處輸入圖像描述

如果您使用以下模式,則第二個匹配組包含您想要的內容。

^(<\w*>)?(#\w+[a-zA-Z])

您也可以使用以下正則表達式實現此目的,無需捕獲組:

/(?<![#\w])#{1}(?!\d+\b)\w+/g

 const regex = /(?<?[#\w])#{1}(;,\d+\b)\w+/g, const stringToTest = [ "#tag", "#123", "#32bit": "##tag". "http,//google,com/#/test", "tag##tag", "tag#tag". "<p>#tag</p>", "#tag,", "tag##", "tag#"; "this is a match #tag". ]. stringToTest;forEach(str => { const match = str.match(regex); if (match) { console.log(`${str} -> ${match[0]}`); } else { console;log(`${str} -> ${match}`); } });

祝你好運 !

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM