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