我得到了类似这样的东西:
$class = 'class="cl"' . " style=" . '"color:black,' . "background:red;" . '"';有没有什么简单的方法可以通过正则表达式将这段代码格式化为" ' ' "样式?我的意思是:
$class = "class='cl'" . " style=" . "'color:black," . "background:red;" . "'";我尝试过这个正则表达式:
'(?!(([^"]"){2})[^"]*$)
但这仅替换了外单引号'。如何将内部双引号替换为单引号?
发布于 2018-06-09 02:55:55
您可以通过三个步骤完成此操作,其中只有第一个步骤需要正则表达式:
µ),一次一对:Find: ('|")(((?!\1).)*).
Repl: µ\2µ
Find: "
'
Find: µ
Repl: "
显然,第一个(也是唯一一个)正则表达式实现了主要的魔力:它捕获它找到的第一个引号(单引号或双引号),然后捕获下一次出现相同类型的引号之前的字符(在负条件下使用\1反向引用,并最终使用.匹配第二个引号)。这样做的条件是所有外引号都是成对出现的。
当您启动第一个替换时,请确保您的插入符号位于文本的最开始处,以便它在任何引号对之外开始。
注意: PHP (您似乎正在使用它,但在其他几种语言中也是如此)允许使用反斜杠对带有字符串文字的引号进行转义。如果这样的转义出现在您的输入中,任务会变得有点复杂,但这是可能的。
发布于 2018-06-09 01:26:16
我自己的解决方案。Notepad++有4个正则表达式。
1.查找两个单引号(')内的所有双引号("),并将其替换为代字号(~):
RegEx: (?:\G(?!^)|([^']*(?:'[^'"]*'[^']*)*'))[^"']*\K"([^"']*+(?:'(?1)|$))?
Replacement: ~$22.找到所有没有被两个双引号(")括起来的单引号('),并将它们替换为反引号(`):
RegEx: '(?=(?:[^"]*"[^"]*")*[^"]*$)
Replacement: `3.查找两个反引号(`)中的所有代字号(~),并将其替换为单引号('):
RegEx: (?:\G(?!^)|([^`]*(?:`[^`~]*`[^`]*)*`))[^~`]*\K~([^~`]*+(?:`(?1)|$))?
Replacement: '$24.和最后一步,将所有代字号(~)和反引号(`)替换为双引号("):
RegEx: ~|`
Replacement: "发布于 2018-06-08 23:37:07
Notepad++使用Boost.Regex 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'";https://stackoverflow.com/questions/50762876
复制相似问题