我需要一个正则表达式来转义或捕获(如果尚未转义)所有双引号字符,并将它们放在一个单引号中,然后将开头的单引号转换为双引号!
我们正在重构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。
谢谢工作几乎就像我想要的:)
该正则表达式只捕获一个",因为您只要求一个。如果要捕获所有引号,则需要在中间加上类似(".*)+的内容。也就是说,"捕获此模式的一个或多个:双精度引号后跟零个或多个任何字符。"
。*("。*)+。*不会提供我想要的内容,在"之后的每场比赛中都会捕获其他一些字符,但不会得到更多的比赛:(