正则表达式在单引号内转义双引号
Posted
技术标签:
【中文标题】正则表达式在单引号内转义双引号【英文标题】:Regular Expression to escape double quotes inside single quotes 【发布时间】:2011-05-01 11:35:47 【问题描述】:我需要一个正则表达式来转义或捕获(如果尚未转义)ALL 双引号字符 INSIDE 单引号字符串,然后转换开头的单引号双引号!
我们正在重构在 php 和 JS 文件中有很多(我的意思是很多!)单引号字符串的文件。它们唯一的共同点是字符串至少在一行中,并且在两种语言中都用 = 连接。
我举个例子(这个例子是丑陋的遗留代码,所以请不要评判它,我已经这样做了 :)) 我们有一个这样开头的文件:
var baseUrl = $("#baseurl").html();
var head = '<div id="finishingDiv" style="background-image:url(baseUrlcss/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(baseUrlcss/userAd/images/out_main.jpg); background-repeat: repeat-y; \">" +
"<div id=\"buttonbar\" style=\"width:810px; text-align:right\">";
如您所见,未触及正确的双引号字符串。
所以我的基本问题是:我如何在某个开始和结束字符(在我的情况下是字符 ' )之间捕获一种类型的所有字符(在我的情况下是字符 " )。
这个正则表达式'.*(").*'
或'[^']*(")[^']*'
只为我每场比赛捕获一个 "。如果需要多个步骤也可以,它应该可以工作。
我会很高兴任何解决方案,IDE 特定的、语言特定的或 shell 特定的,它确实有效。
请帮助,我很绝望,非常感谢
【问题讨论】:
【参考方案1】:最大的问题是找出所有字符串的位置,因为您无法使用正则表达式解析所有 JS 或 PHP。但是,如果我假设您不关心 cmets,那么此 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
。
【讨论】:
【参考方案2】:那个正则表达式只捕获一个 " 因为你只要求一个。如果你想捕获所有的引号,你需要在中间更像 (".*)+
的东西。也就是说,"捕获一个或多个这种模式: 双引号后跟零个或多个任意字符。”
【讨论】:
'.*(".*)+.*' 没有提供我想要的,在 " 之后每次匹配捕获一些其他字符,但没有得到更多匹配:(以上是关于正则表达式在单引号内转义双引号的主要内容,如果未能解决你的问题,请参考以下文章