簡體   English   中英

避免重復正則表達式替換

[英]Avoid repeating regex substitution

我有以下形式的代碼行(組成Ruby哈希):

"some text with spaces" => "some other text",

我編寫了以下vim風格的regex模式來實現我的目標,即用+替換=>左側字符串中的所有空格:

:%s/\(.*\".*\)\ (.*\"\ =>.*\,)/\1+\2

預期產量:

"some+text+with+spaces" => "some other text",

不幸的是,這僅替換了最靠近=>的空間。 是否有另一種模式可以一次運行替換所有空間?

與其編寫大型復雜的正則表達式,不如編寫幾個較小的正則表達式會更容易

:%s/".\{-}"/\=substitute(submatch(0), ' ', '+', 'g')

例如,這將捕獲引號中的所有內容(轉義的引號將其括起來),然后用加號替換匹配字符串中的所有空格。

如果您希望它與字符串中的轉義的引號一起使用,則只需將".\\{-}"替換為稍微復雜一點的正則表達式"\\(\\\\.\\|[^\\"]\\)*"

:%s/"\(\\.\|[^\"]\)*"/\=substitute(submatch(0), ' ', '+', 'g')

如果要限制此替代項運行的行,請使用全局命令。

:g/=>/s/"\(\\.\|[^\"]\)*"/\=substitute(submatch(0), ' ', '+', 'g')

因此,它將僅在帶有=>行上運行。

相關幫助主題:h sub-replace-expression

這確實遠非完美,但幾乎可以完成工作:

:%s/\s\ze[^"]*"\s*=>\s*".*"/+/g

但是它不處理轉義引號,因此以下行將無法正確替換:

"some \"big text\" with many spaces" => "some other text",

暫無
暫無

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

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