我需要一个正则表达式来逃避或捕获(如果尚未转义)全部双引号字符 INSIDE 一个引用的字符串,然后转换开头的单引号双引号!
我们正在重构那些在PHP和JS文件中都有很多(我的意思是很多!)单引号字符串的文件。他们唯一的共同点是字符串至少在一行中,并且在两种语言中都与=结合。
我举一个例子(示例是丑陋的遗留代码,所以不要判断它,我已经做了这个 :)) 我们有一个如下所示的文件:
var baseUrl = $("#baseurl").html();
var head = '<div id="finishingDiv" style="background-image:url({baseUrl}css/userAd/images/out_main.jpg); background-repeat: repeat-y; ">'+
'<div id="buttonbar" style="width:810px; text-align:right">';
我希望它看起来像这样:
var baseUrl = $("#baseurl").html();
var head = "<div id=\"finishingDiv\" style=\"background-image:url({baseUrl}css/userAd/images/out_main.jpg); background-repeat: repeat-y; \">" +
"<div id=\"buttonbar\" style=\"width:810px; text-align:right\">";
如您所见,未触及正确的双引号字符串。
所以我的基本问题是:我如何捕捉某个开头和结尾字符(在我的情况下是字符')之间的所有字符(在我的情况下是字符“)。
这个正则表达式'.*(").*'
或'[^']*(")[^']*'
只会为每个匹配对我进行一次“捕获。如果需要不止一步也可以,它应该正常工作。
我会很高兴任何解决方案,特定于IDE,特定于语言或特定于shell,这些都是可行的。
请帮助,我绝望,非常感谢
答案 0 :(得分:1)
最大的问题是要弄清楚所有字符串的位置,因为你无法使用正则表达式解析所有JS或PHP。但是,如果我假设你不关心注释,这个Ruby代码将捕获大多数情况(但你应该检查它的输出):
#!/usr/bin/ruby -p
gsub!(/'((?:[^\\']|\\[\\'])+)'/) do |m|
%Q{"#{$1.gsub("\\'","'").gsub(/\\[^\\]/) { "\\#{$0}" }.gsub('"','\\"')}"}
end
此代码采用stdin上显示的内容/文件参数的内容,查找单引号字符串(考虑可能存在\\
和\'
),然后,为其替换,在匹配的字符串中运行一系列替换(清理反斜杠等)。结果打印到stdout。如果您想要更自动化的方法,请将第一行替换为#!/usr/bin/ruby -pi.bak
;然后,无论文件参数呈现什么,都会对它们进行替换破坏性就地。旧文件保留了额外的.bak
扩展名。
要运行此代码,如果您之前没有使用过Ruby:将其保存为任何内容,例如fix-sq.rb
;运行chmod +x fix-sq.rb
;然后运行./fix-sq.rb file1 file2 file3
。
答案 1 :(得分:0)
正则表达式只捕获一个“因为你只需要一个。如果你想捕获所有引号,你需要更像中间的(".*)+
。这就是说,”捕获一个或多个这种模式:双引号后跟零个或多个任何字符。“