我需要一個正規表達式來轉義或捕獲(如果尚未轉義)所有雙引号字元,并将它們放在一個單引号中,然後将開頭的單引号轉換為雙引号!
我們正在重構PHP和JS檔案中具有很多(我的意思是很多!)單引号字元串的檔案。它們唯一的共同點是字元串至少在一行中,并且在兩種語言中都用=表示。
我舉一個例子(這個例子是醜陋的舊代碼,是以請不要判斷它,我已經做到了:))
我們有一個像這樣開始的檔案:
var baseUrl = $("#baseurl").html();
var head = ''+
'';
我希望它看起來像這樣:
var baseUrl = $("#baseurl").html();
var head ="" +
"";
如您所見,未觸及正确的雙引号字元串。
是以我的基本問題是:如何捕獲某個開始字元和結束字元(在我的情況下是字元')之間的一種字元(在我的情況下是字元"")。
這個正規表達式'.*(").*'或'[^']*(")[^']*'每次比賽總是為我捕獲一個"。如果需要多個步驟,也可以,那麼就可以了。
我對任何能夠正常工作的解決方案(IDE特定,語言特定或外殼特定)感到滿意。
請幫助,我很拼命,非常感謝
最大的問題是要弄清楚所有字元串的位置,因為您不能使用正規表達式解析所有JS或PHP。但是,如果我假設您不關心注釋,那麼此Ruby代碼将捕獲大多數情況(但您應檢視其輸出):
#!/usr/bin/ruby -p
gsub!(/'((?:[^\']|\\[\'])+)'/) do |m|
%Q{"#{$1.gsub("\'","'").gsub(/\\[^\\]/) {"\\#{$0}" }.gsub('"','\"')}"}
end
此代碼采用stdin上給出的所有内容/檔案參數的内容,找到單引号引起來的字元串(考慮到\\和\'的可能存在),然後對其進行替換,運作一系列替換在比對的字元串中(清除反斜杠等)。結果列印到标準輸出。如果您想要一種更自動化的方法,請用#!/usr/bin/ruby -pi.bak替換第一行;然後,無論呈現什麼檔案參數,都将對其進行破壞性的就地替換。舊檔案保留了附加的.bak擴充名。
要運作此代碼,如果您以前沒有使用過Ruby,請将其另存為任何内容,例如fix-sq.rb;運作chmod +x fix-sq.rb;然後運作./fix-sq.rb file1 file2 file3。
謝謝工作幾乎就像我想要的:)
該正規表達式隻捕獲一個",因為您隻要求一個。如果要捕獲所有引号,則需要在中間加上類似(".*)+的内容。也就是說,"捕獲此模式的一個或多個:雙精度引号後跟零個或多個任何字元。"
。*("。*)+。*不會提供我想要的内容,在"之後的每場比賽中都會捕獲其他一些字元,但不會得到更多的比賽:(