首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将外部单引号(')替换为双引号("),将内部双引号(")替换为单qoutes (')

问将外部单引号(')替换为双引号("),将内部双引号(")替换为单qoutes (')
EN

Stack Overflow用户
提问于 2018-06-08 22:30:20
回答 3查看 719关注 0票数 5

我得到了类似这样的东西:

代码语言:javascript
复制
$class = 'class="cl"' . " style=" . '"color:black,' . "background:red;" . '"';

有没有什么简单的方法可以通过正则表达式将这段代码格式化为" ' ' "样式?我的意思是:

代码语言:javascript
复制
$class = "class='cl'" . " style=" . "'color:black," . "background:red;" . "'";

我尝试过这个正则表达式:

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

但这仅替换了外单引号'。如何将内部双引号替换为单引号?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-09 02:55:55

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

  1. 将每个外引号(无论是单引号还是双引号)替换为不使用的字符(例如µ),一次一对:

Find: ('|")(((?!\1).)*).

Repl: µ\2µ

  • 将剩余的每个双引号替换为单引号,因为根据步骤1的结果,它们是内部的:

Find: "

'

  • Replace :使用双引号对(步骤1的)出现的每个特殊字符执行操作

Find: µ

Repl: "

显然,第一个(也是唯一一个)正则表达式实现了主要的魔力:它捕获它找到的第一个引号(单引号或双引号),然后捕获下一次出现相同类型的引号之前的字符(在负条件下使用\1反向引用,并最终使用.匹配第二个引号)。这样做的条件是所有外引号都是成对出现的。

当您启动第一个替换时,请确保您的插入符号位于文本的最开始处,以便它在任何引号对之外开始。

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

票数 3
EN

Stack Overflow用户

发布于 2018-06-09 01:26:16

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

1.查找两个单引号(')内的所有双引号("),并将其替换为代字号(~):

代码语言:javascript
复制
RegEx: (?:\G(?!^)|([^']*(?:'[^'"]*'[^']*)*'))[^"']*\K"([^"']*+(?:'(?1)|$))?
Replacement: ~$2

2.找到所有没有被两个双引号(")括起来的单引号('),并将它们替换为反引号(`):

代码语言:javascript
复制
RegEx: '(?=(?:[^"]*"[^"]*")*[^"]*$)
Replacement: `

3.查找两个反引号(`)中的所有代字号(~),并将其替换为单引号('):

代码语言:javascript
复制
RegEx: (?:\G(?!^)|([^`]*(?:`[^`~]*`[^`]*)*`))[^~`]*\K~([^~`]*+(?:`(?1)|$))?
Replacement: '$2

4.和最后一步,将所有代字号(~)和反引号(`)替换为双引号("):

代码语言:javascript
复制
RegEx: ~|`
Replacement: "

在第一步之前,代码中不应该出现代字号和反引号。感谢link1和link2

票数 2
EN

Stack Overflow用户

发布于 2018-06-08 23:37:07

Notepad++使用Boost.Regex C++库中的正则表达式引擎。

所以可以在替换字符串中使用Conditional Replacement。

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

在Notepad++中

查找内容:

代码语言:javascript
复制
(?:"[^"]*"\s*[.;]\K)|(?:(?:(')|("))(?=[^.;]*?[.;]))

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

替换为:

代码语言:javascript
复制
(?1")(?2')

搜索模式:

代码语言:javascript
复制
Regular expression

示例:

此示例字符串:

代码语言:javascript
复制
$class = 'change="this"' . 'change="this" change="this"' . 'change"this"' . '"change:this,' . " keep=this" . " keep:this;" . "dontchange='this'" . '"' . '"change_me"';

对以下内容的更改:

代码语言:javascript
复制
$class = "change='this'" . "change='this' change='this'" . "change'this'" . "'change:this," . " keep=this" . " keep:this;" . "dontchange='this'" . "'" . "'change_me'";
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50762876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档