【问题标题】:Replace outer single quotes (') to double (") and inner double (") to single qoutes (')将外部单引号 (') 替换为双引号 ("),将内部双引号 (") 替换为单引号 (')
【发布时间】:2018-11-18 15:31:15
【问题描述】:

我有这样的东西:

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

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

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

我试过这个正则表达式:

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

但这仅替换外部单引号'。如何也可以用单引号替换内部双引号?

【问题讨论】:

  • 我想知道它是否确实存在。我认为这里需要嵌入条件。
  • 没有一些代码是不可能的。 PythonScript 脚本呢?
  • 维克托,可能,是的。然而,也许有一个带有条件替换的正则表达式解决方案(如this)。我找到了四步正则表达式解决方案

标签: regex notepad++


【解决方案1】:

Notepad++ 使用来自Boost.Regex C++ 库的正则表达式引擎。
所以可以在替换字符串中使用Conditional Replacement

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

在记事本++中

查找内容:

(?:"[^"]*"\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'";

【讨论】:

  • LukStorms,感谢您的一站式解决方案! :) ,但如果有超过 2 个内部双引号,它就不起作用。试试这个例子:'xxx="yyy"' 'xxx="yyy" xxx="yyy"' 'xxx="yyy"'
  • "xxx='yyy'" 'xxx="yyy" xxx="yyy"" "xxx="yyy"' 第一个字符串可以,第二个不行,第三个不行也是因为第二个字符串。但我同意,我认为有条件替换的解决方案。
  • @newtonrus Urgh,多个组,单引号之间有双引号。纯正则表达式替换解决方案对于嵌套等问题有点问题。无论如何,我已经稍微改变了我的解决方案。现在它也会处理这些问题。
  • LukStorms,您的新正则表达式更正确,但仍有错误。例如正确的字符串,如:“dontchange='this'” 你的正则表达式也在改变:'dontchange="this""
  • 在当前版本中不再更改。
【解决方案2】:

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

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

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

  2. 用单引号替换每个剩余的双引号,因为由于步骤 1,它们是内部的:

    查找: "
    回复: '

  3. 用双引号替换每次出现的特殊字符(步骤 1)

    查找: µ
    回复: "

显然,第一个(也是唯一一个)正则表达式具有主要的魔力:它捕获它找到的第一个引号(单引号或双引号),然后捕获字符直到下一次出现 same引用(在否定条件下使用\1 反向引用,并最终将第二次出现与. 匹配)。这样做的条件是所有外部引号成对出现。

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

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

【讨论】:

  • 嘿 Trincot,当引号不需要像 " style=" 中那样更改时,这会留下引号吗?
  • 不,第一步将替换它们,但第三步将再次恢复它们。所以在某种程度上,答案也是“是”。
  • 哦,是的,您确实是对的,对答案的关注不够:) 顺便说一句,答案很好
  • trincot,太棒了!谢谢! :) 我猜你的解决方案是 100%。现在我正在测试我的文件。
  • trincot,你优雅的正则表达式计算出了我所有的源代码(20 多个旧文件)。没有错误! :)
【解决方案3】:

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

1. 找出两个单引号 (') 内的所有双引号 (") 并用波浪号 (~) 替换它们:

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

2. 找出所有没有被两个双引号 (") 包围的单引号 (') 并用反引号 (`) 替换它们:

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

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

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

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

RegEx: ~|`
Replacement: "

波浪号和反引号不应出现在第一步之前的代码中。 感谢link1link2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2021-08-12
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多