正则表达式以在单引号内转义双引号

时间:2010-10-27 18:16:40

标签: regex double quotes

我需要一个正则表达式来逃避或捕获(如果尚未转义)全部双引号字符 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,这些都是可行的。

请帮助,我绝望,非常感谢

2 个答案:

答案 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)

正则表达式只捕获一个“因为你只需要一个。如果你想捕获所有引号,你需要更像中间的(".*)+。这就是说,”捕获一个或多个这种模式:双引号后跟零个或多个任何字符。“