首頁  >  文章  >  後端開發  >  正規表示式從匹配中排除括號之間的文本

正規表示式從匹配中排除括號之間的文本

WBOY
WBOY轉載
2024-02-09 21:51:09831瀏覽

正規表示式從匹配中排除括號之間的文本

php小編香蕉為您介紹一個強大且常用的字串處理工具-正規表示式。正規表示式在匹配字串時可以排除括號之間的文本,這在處理複雜的文本資料時非常實用。透過簡單的語法規則,我們可以輕鬆實現字串的篩選和提取,提高資料處理的效率和準確性。無論是在開發網頁、處理數據,或是進行文字分析等場景中,掌握正規表示式都是必備技能。讓我們一起來學習正規表示式,提升我們的字串處理能力吧!

問題內容

給定以下文字:

{field1} == value1 && {field2} == value2  && ({field3} == value3 && {field4} == value4) && {field5} == value5

我正在嘗試建立一個與該文字上的所有 && 相符的正規表示式,但排除括號之間的內容(因此 value3 和 field4 之間的 && 應被忽略)。我已經能夠使用以下正規表示式來完成此操作: (\&{2})(?![^\(]*\)) [這個有效並且正在執行我需要的操作] 但問題是我正在使用golang,不支援負向前瞻。有什麼辦法可以做到沒有負面的前瞻?括號不能嵌套。

基本上我想按 && 進行分割,但忽略括號之間的內容並得到類似的內容:

[&&, &&, &&]
[{field1} == value1, {field2} == value2, ({field3} == value3 && {field4} == value4), {field5} == value5]

謝謝!

解決方法

您可以使用一種技術,透過該技術,匹配不需要的所有內容,但不捕獲它們,而匹配並捕獲所需的所有內容(即保存到捕獲組)。您可以使用以下正規表示式來做到這一點。

\([^\]]*\)|(&&)

內容為「匹配括號中的字串或 (|) 匹配字串 」&&「 並將其儲存到捕獲組 1」。這個想法是(在程式碼中)忽略未捕獲的匹配。

對於以下字串,顯示匹配項(由 "m"s 表示)和捕獲(由 "c"s 表示)。

{f1} == v1 && {f2} == v2  && ({f3} == v3 && {f4} == v4) && {f5} == v5
           mm                mmmmmmmmmmmmmmmmmmmmmmmmmm mm
           cc                                           cc

示範

在字串({)的開頭,\([^\]]*\)(&&) 都不匹配,因此字符串指標前進一位到f。同樣,沒有匹配項,因此字串指標又前進一個字符,指向 1。這將繼續(沒有匹配項),直到到達第一個 &\([^\]]*\) 不匹配,但 (&&) 匹配。我們對該匹配感興趣,因為它已被捕獲(捕獲組 1)。

然後字串指標一次向前移動一個字符,不再找到任何匹配項,直到到達(。此時,({f3} == v3 && {f4} == v4)\([^\]]*\) 匹配,但由於它沒有被捕獲,所以我們不關注它。這種情況一直持續到到達字串末尾。

或者,我們可以使用正規表示式

\([^\]]*\)|&&

並檢查每個匹配的第一個字元。如果是 ( 我們放棄考慮匹配。

當找到&& 的每個匹配項時,我們可能(在程式碼中)將其替換為另一個(可能為空)字串,以取得其在字串中的偏移量(出於某種目的)或簡單地增加字串中匹配數的計數器。這當然取決於我們為什麼要匹配這些字串。

以上是正規表示式從匹配中排除括號之間的文本的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除