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

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】:

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

【讨论】:

'.*(".*)+.*' 没有提供我想要的,在 " 之后每次匹配捕获一些其他字符,但没有得到更多匹配:(

以上是关于正则表达式在单引号内转义双引号的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配双引号内的每个字符串并包含转义引号

使用正则表达式转义单引号字符串中的所有双引号 [重复]

正则表达式删去双引号vscode

在coffeescript正则表达式中应该如何转义双引号?

python 单个正则表达式,用于解析Python单引号或双引号字符串,同时保留任何转义的引号字符

具有奇怪行为的正则表达式:将字符串与反向引用匹配以允许转义以及单引号和双引号