簡體   English   中英

正則表達式匹配 # 之間的文本,並且僅當 # 前面沒有 '

[英]Regular Expression to match text between # and only if # is not preceded by '

您好,我正在嘗試找到一個正則表達式,它可以幫助我找到字符串中的所有匹配項,前提是它們位於 # 內,並且僅當 # 前面沒有撇號“'”時。

基本上,當我們使用 double * 來加粗文本時,我需要像這里一樣加粗文本,但撇號應該用作轉義字符。

例如
#你好,我的名字是 Noé # 應該看起來像你好,我的名字是 Noé

#Hello this has an escape apostrophe '# so I'll match until here# 應該看起來像Hello this has an escape apostrophe '# 所以我會匹配到這里

在一個長文本中,可能有也可能沒有幾個匹配項:
“你好,我是一個文本#我是粗體#,我需要知道如何匹配我在兩個 '# 內的文本,並且 #I 不會匹配任何一個,因為我沒有盡頭”

所以我可以像打印一樣
“你好,我是一個粗體文本,我需要知道如何匹配我在兩個 '# 內的文本,並且 #I 不會匹配任何一個,因為我沒有盡頭”

如果使用 RegExp 無法做到這一點,我可以編寫一個有限狀態機,但我希望我有可能,在此先感謝您,上帝保佑您!

注意:我稍后會處理轉義字符我只需要知道如何處理這個

/(?<!')#.*(?<!')#/gim

這是我唯一能想到的事情,但老實說,我不知道背后的負面看法是如何工作的:(,使用這個正則表達式它會匹配錯誤。例如,如果我輸入:
“我是一個文本#並且我應該是一個匹配#,這不應該#但是這也應該#而且我只是一些隨機的額外文本”

匹配從第一次出現到最后一次,如下所示:

“我是一個文本#並且我應該是一個匹配#,這不應該#但是這也應該#而且我只是一些隨機的額外文本”

我認為這應該有效:

(?<!')#(.*?)(?<!')#

在這里您可以看到與您的示例一起使用的正則表達式: https : //regex101.com/r/wnguiA/1

(?<!')Negative Lookbehind ,它告訴正則表達式引擎在字符串中暫時后退,以檢查lookbehind 中的文本是否可以在那里匹配。 (?<!a)b相匹配的b不是由一個前面a

更簡單的是(.*?)匹配任何字符(行終止符除外); 添加? 告訴捕獲組不要貪婪並在連續令牌的第一次出現時停止。

為防止在所有未向左側斷言'的位置觸發否定后視,您還可以先匹配#並在其后進行斷言。

#(?<!'#)(.*?)#(?<!'#)

正則表達式演示

另一種選擇而不是使用非貪婪的.*? 是使用與除#以外的任何字符匹配的否定字符類

然后,當您遇到#僅在它之前有'時才匹配它,使用正向后視。

#(?<!'#)([^#\n]*(?:#(?<='#)[^#\n]*)*)#(?<!'#)
  • #(?<!'#)匹配#前面不直接帶有'
  • (捕獲組 1
    • [^#\\n]*可選擇匹配除#或換行符以外的任何字符
    • (?:非捕獲組
      • #(?<='#)匹配#不直接以'開頭
      • [^#\\n]*匹配除#或換行符以外的任何字符的可選重復
    • )*關閉非捕獲組並可選擇重復它以匹配所有出現
  • )關閉第 1 組
  • #(?<!'#)匹配#前面不直接帶有'

正則表達式演示

暫無
暫無

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

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