【问题标题】:replace single-quote with double-quote, if and only if quote is after specific string用双引号替换单引号,当且仅当引号在特定字符串之后
【发布时间】:2020-05-24 15:34:42
【问题描述】:

我正在使用 notepad++,并使用它的查找替换对话框。
NP++ 文档指出:Notepad++ 正则表达式使用 Boost 正则表达式库 v1.70,它基于 PCRE(Perl 兼容正则表达式)语法。参考:https://npp-user-manual.org/docs/searching

我正在尝试做的事情应该很简单,但我是一个正则表达式新手,经过 2-3 小时的网络搜索和在线正则表达式测试员玩后,我放弃了。 我想用双引号 " 替换所有单引号 ' ,但 当且仅当 ' 位于一个或多个 # 的右侧,即在 python 注释中. 例如,

list1 = ['apple','banana','pear'] # All 'single quotes' to LEFT of # remained unchanged.
list2 = ['tomato','carrot'] # All 'single quotes' to RIGHT of one or more # are replaced 
# # with "double quotes", like this. 

np++ 文件超过 800 行,手动替换会很繁琐且容易出错。建议表示赞赏。

【问题讨论】:

    标签: regex notepad++


    【解决方案1】:

    这个正则表达式应该做你想做的事:

    (^[^#]*#|(?<!^)\G)[^'\n]*\K'
    

    它会寻找一个',前面有一个

    1. ^[^#]*# :行首和一些非# 字符后跟#;或
    2. (?&lt;!^)\G :行首或上一个匹配的结尾(\G),对行首(?&lt;!^) 进行否定的lookbehind,这意味着它只匹配上一个匹配的结尾

    然后是一些非' 或换行符(以防止匹配环绕上一行的末尾)字符[^'\n]*

    然后我们使用\K 重置匹配,以便从匹配中丢弃之前的所有内容,并且正则表达式仅匹配'

    然后可以将其替换为"

    Demo on regex101

    更新

    您可以通过仅匹配前面或后面有非单词字符的撇号来避免在单词中匹配撇号:

    (^[^#]*#|(?<!^)\G)[^'\n]*\K('(?=\W)|(?<=\W)')
    

    Demo on regex101

    更新 2

    您还可以通过限定正则表达式的第一部分来处理字符串中有# 字符的情况,并要求事先匹配一对引号:

    (?:^[^'#]*(?:'[^']*'[^#']*)*[^'#]*#|(?<!^)\G)[^'\n]*\K(?:'(?=\W)|(?<=\W)')
    

    Demo on regex101

    【讨论】:

    • 如果# 的右侧有故意撇号的单词,例如单词:don't , Alice's,则会出现轻微的打嗝。但只有少数情况,手动修复更实用。
    • @TomH 我可能可以修复打嗝 - 如果你有一个包含 # 的字符串位于标记评论的 # 的左侧,我可能会遇到另一个可能的打嗝。让我考虑一下,我会发布更新。
    • @TomH 我已经为这两个“打嗝”添加了修复程序
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    • 2011-12-07
    • 2011-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多