regex - 使用 Regex 转义单引号字符串中的所有双引号

标签 regex perl escaping quotes substitution

<分区>

Possible Duplicate:
Regular Expression to escape double quotes inside single quotes

我需要一个正则表达式(没有其他语言!!,最好是 perl 语法 REGEX 或 PCRE 语法 REGEX)用 \" 替换所有双引号 "在单引号字符串内。这是一个示例字符串(文件的一部分):

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">';

(请注意:它们不必成对出现“someValueBetween”,因此在一个单引号字符串中可能存在不均匀数量的双引号。)

这应该是上面最后一行的最终结果:

'<div id=\"buttonbar\" style=\"width:810px; text-align:right\">';

提前致谢

***更新: 为了清楚起见,我只想要一个正则表达式,而不是一个 perl 程序。正则表达式可以是 perl regex 语法或 PHP PCRE 语法(据我所知,这是与 perl regex 语法非常接近的语法)。目标是您可以在搜索中运行 IDES 中的正则表达式并替换支持正则表达式的菜单(如 Eclipse 和 PhpEd f.e)!!

换句话说,我想要一个正则表达式,我将把它放在搜索 IDE 字段中,结果在单引号字符串中给出所有未转义的 " 。在 eclipse 的替换字段中我然后可以只用 \$1 来转义它们。

它们应该在 Regexbuddy 或 regex coach 中工作,以便我可以测试它们。

至少这是计划:)


最佳答案

您只要求 Perl(或 PCRE)。

好的。

如果您只想转义未转义的双引号,无论您在哪里找到它们,请执行以下操作:

  s{
      (?<! (?<! \\ ) \\{1} )
      (?<! (?<! \\ ) \\{3} )
      (?<! (?<! \\ ) \\{5} )
      (?<! (?<! \\ ) \\{7} )
      (?= " )
  }{\\}xg;

如果您想在未转义的单引号之间转义未转义的双引号,而您只有一对这样的单引号,请执行以下操作:

1 while s{

  (?(DEFINE)

    (?<unescaped>
      (?<! (?<! \\ ) \\{1} )
      (?<! (?<! \\ ) \\{3} )
      (?<! (?<! \\ ) \\{5} )
      (?<! (?<! \\ ) \\{7} )
    )

    (?<single_quote> (?&unescaped) ' )
    (?<double_quote> (?&unescaped) " )
    (?<unquoted>     [^'] *?          )

  )

  (?<HEAD>
    (?&single_quote)
    (?&unquoted)
  )

  (?<TAIL>
    (?&double_quote)
    (?&unquoted)
    (?&single_quote)

  )

}<$+{HEAD}\\$+{TAIL}>xg;

但是,如果您每行可能有多组成对的未转义单引号,并且您只想转义位于这些未转义单引号之间的未转义双引号,那么请执行以下操作:

sub escape_quote {
  my $_ = shift;
  s{
      (?<! (?<! \\ ) \\{1} )
      (?<! (?<! \\ ) \\{3} )
      (?<! (?<! \\ ) \\{5} )
      (?<! (?<! \\ ) \\{7} )
      (?= " )
  }{\\}xg;

  return $_;
}

s{

  (?(DEFINE)

    (?<unescaped>
      (?<! (?<! \\ ) \\{1} )
      (?<! (?<! \\ ) \\{3} )
      (?<! (?<! \\ ) \\{5} )
      (?<! (?<! \\ ) \\{7} )
    )

    (?<single_quote> (?&unescaped) ' )
    (?<unquoted>     [^'] *?          )

  )

  (?<HEAD> (?&single_quote) )
  (?<TARGET> (?&unquoted) )
  (?<TAIL> (?&single_quote) )

}{
               $+{HEAD}    .
  escape_quote($+{TARGET}) .
               $+{TAIL}

}xeg;

请注意,这一切都假定您没有包含未转义单引号的合法配对未转义双引号。即使是这样的事情也会让你失望:

my $cute = q(') . "stuff" . q(');

不过,您可能想要使用适当的解析模块。

请不要注意所有花哨和欺骗性的错误 SO 着色。由于某种原因,它似乎无法像 perl 那样解析 Perl。无法想象为什么。 ☺

关于regex - 使用 Regex 转义单引号字符串中的所有双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4073114/

相关文章:

bash - 转义参数中的冒号、等于、& 符号

php - 如何在 PHP 中从这个组合中删除点

perl - 如何将调用环境正确导出到 Perl 的子 shell 中?

android - 带错误检查的正则表达式

perl - 如何使用 Perl 将本地时间转换为 YYYY-MM-DD

perl - 从函数返回散列的最佳 Perl 实践是什么?

java - Adb 拉取路径中包含特殊字符的文件

php - 我该如何解决这个错误?弃用 : mysql_escape_string(): This function is deprecated; use mysql_real_escape_string() instead

javascript - 尝试通过 jQuery/replace() 删除括号内的 anchor 文本

python - 在Python中使用正则表达式提取特定值