我有这样的事情:
$class = 'class="cl"' . " style=" . '"color:black,' . "background:red;" . '"';
正则表达式是否有任何简单的方法将此代码格式化为" ' ' "
样式?
我的意思是:
$class = "class='cl'" . " style=" . "'color:black," . "background:red;" . "'";
我试过这个正则表达式:
'(?!(([^"]"){2})[^"]*$)
但这只取代外部单引号'
。我怎样才能用单引号替换内部双引号?
答案 0 :(得分:2)
我自己的解决方案。 Notepad ++有4个正则表达式。
1. 在两个单引号(')中找到所有双引号(“)并用代字号(〜)替换它们:
RegEx: (?:\G(?!^)|([^']*(?:'[^'"]*'[^']*)*'))[^"']*\K"([^"']*+(?:'(?1)|$))?
Replacement: ~$2
2. 查找所有单引号(')未被两个双引号括起来(“)并用反引号(`)替换它们:
RegEx: '(?=(?:[^"]*"[^"]*")*[^"]*$)
Replacement: `
3. 在两个反引号(`)中查找所有波浪号(〜)并将其替换为单引号('):
RegEx: (?:\G(?!^)|([^`]*(?:`[^`~]*`[^`]*)*`))[^~`]*\K~([^~`]*+(?:`(?1)|$))?
Replacement: '$2
4. 最后一步,所有代号(〜)和反引号(`)替换为双引号(“):
RegEx: ~|`
Replacement: "
答案 1 :(得分:2)
您可以分三步完成此操作,其中只有第一步需要正则表达式:
用一个未使用的字符(例如µ
)替换每个外部引用(无论是单一或双重),一次一对:
查找: ('|")(((?!\1).)*).
Repl: µ\2µ
用单引号替换每个剩余的双引号,因为第1步的结果是内部:
查找: "
Repl: '
用双引号
替换每个出现的特殊字符(步骤1) 查找: µ
Repl: "
显然,第一个(也是唯一的)正则表达式具有主要的魔力:它捕获它找到的第一个引号(单个或双重)然后捕获字符直到下一次出现的相同类型引用(在负面条件下使用\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'";