将外部单引号(')替换为double(“),将内部double(”)替换为单个qoutes(')

时间:2018-06-08 14:30:20

标签: regex notepad++

我有这样的事情:

$class = 'class="cl"' . " style=" . '"color:black,' . "background:red;" . '"';

正则表达式是否有任何简单的方法将此代码格式化为" ' ' "样式? 我的意思是:

$class = "class='cl'" . " style=" . "'color:black," . "background:red;" . "'";

我试过这个正则表达式:

  

'(?!(([^"]"){2})[^"]*$)

但这只取代外部单引号'。我怎样才能用单引号替换内部双引号?

3 个答案:

答案 0 :(得分:2)

我自己的解决方案。 Notepad ++有4个正则表达式。

  

1. 在两个单引号(')中找到所有双引号(“)并用代字号(〜)替换它们:

RegEx: (?:\G(?!^)|([^']*(?:'[^'"]*'[^']*)*'))[^"']*\K"([^"']*+(?:'(?1)|$))?
Replacement: ~$2
  

2. 查找所有单引号(')未被两个双引号括起来(“)并用反引号(`)替换它们:

RegEx: '(?=(?:[^"]*"[^"]*")*[^"]*$)
Replacement: `
  

3. 在两个反引号(`)中查找所有波浪号(〜)并将其替换为单引号('):

RegEx: (?:\G(?!^)|([^`]*(?:`[^`~]*`[^`]*)*`))[^~`]*\K~([^~`]*+(?:`(?1)|$))?
Replacement: '$2
  

4. 最后一步,所有代号(〜)和反引号(`)替换为双引号(“):

RegEx: ~|`
Replacement: "

在第一步之前,不应在代码中出现Tildes和backquotes。 感谢link1link2

答案 1 :(得分:2)

您可以分三步完成此操作,其中只有第一步需要正则表达式:

  1. 用一个未使用的字符(例如µ)替换每个外部引用(无论是单一或双重),一次一对:

    查找: ('|")(((?!\1).)*).
    Repl: µ\2µ

  2. 用单引号替换每个剩余的双引号,因为第1步的结果是内部:

    查找: "
    Repl: '

  3. 用双引号

    替换每个出现的特殊字符(步骤1)

    查找: µ
    Repl: "

  4. 显然,第一个(也是唯一的)正则表达式具有主要的魔力:它捕获它找到的第一个引号(单个或双重)然后捕获字符直到下一次出现的相同类型引用(在负面条件下使用\1反向引用并最终将第二次出现与.匹配)。这项工作的条件是所有外部报价成对出现。

    当您启动第一个替换时,请确保您的插入符号位于文本的最开头,因此它从任何引号对开始。

    注意:PHP(您似乎使用它,但在其他几种语言中也是如此)允许带有字符串文字的引号使用反斜杠进行转义。如果您的输入中存在这样的转义,则任务会变得有点复杂,但这是可能的。

答案 2 :(得分:0)

Notepad ++使用Boost。正则表达式C ++库中的正则表达式引擎 因此,可以在替换字符串中使用Conditional Replacement

使用该技巧,只有1个正则表达式替换可以完成这项工作。

在Notepad ++中

查找内容:

(?:"[^"]*"\s*[.;]\K)|(?:(?:(')|("))(?=[^.;]*?[.;]))

关于正则表达式,首先它匹配双引号括起的部分,然后通过\K从匹配结果中删除它们。然后捕获剩余的引号。

替换为:

(?1")(?2')

搜索模式:

Regular expression

示例:

此示例字符串:

$class = 'change="this"' . 'change="this" change="this"' . 'change"this"' . '"change:this,' . " keep=this" . " keep:this;" . "dontchange='this'" . '"' . '"change_me"';

更改为:

$class = "change='this'" . "change='this' change='this'" . "change'this'" . "'change:this," . " keep=this" . " keep:this;" . "dontchange='this'" . "'" . "'change_me'";