[英]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.