天天看點

php 正則比對單雙引号,關于正規表達式:正規表達式可在單引号内轉義雙引号...

我需要一個正規表達式來轉義或捕獲(如果尚未轉義)所有雙引号字元,并将它們放在一個單引号中,然後将開頭的單引号轉換為雙引号!

我們正在重構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。

謝謝工作幾乎就像我想要的:)

該正規表達式隻捕獲一個",因為您隻要求一個。如果要捕獲所有引号,則需要在中間加上類似(".*)+的内容。也就是說,"捕獲此模式的一個或多個:雙精度引号後跟零個或多個任何字元。"

。*("。*)+。*不會提供我想要的内容,在"之後的每場比賽中都會捕獲其他一些字元,但不會得到更多的比賽:(