首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用双引号替换单引号,当且仅当引号在特定字符串之后。

用双引号替换单引号,当且仅当引号在特定字符串之后。
EN

Stack Overflow用户
提问于 2020-02-08 21:35:37
回答 1查看 400关注 0票数 0

我正在使用notepad++,并使用它的“查找-替换”对话框。

NP++文档声明: Notepad++正则表达式使用Boost正则表达式库v1.70,该库基于PCRE (Perl兼容正则表达式)语法。参考文献:https://npp-user-manual.org/docs/searching

我试图做的事情应该很简单,但我是一个regex新手,经过2-3个小时的网络搜索和与在线regex测试人员的游戏,我放弃了。

我想将所有单引号'替换为双引号",但当且仅当'位于一个或多个'的右边(即在python注释中)。例如,

代码语言:javascript
复制
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行,手动替换将非常繁琐和容易出错。谢谢你的建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-08 22:08:37

这个regex应该做你想做的事:

代码语言:javascript
复制
(^[^#]*#|(?<!^)\G)[^'\n]*\K'

它寻找一个',它的前面有两个

  1. ^[^#]*#:行的开始和一些非#字符,后面跟着一个#;或
  2. (?<!^)\G:行的开始或上一次匹配的结束(\G),对行(?<!^)的开始有负的查找,这意味着它仅在上一次匹配的末尾匹配。

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

然后,我们使用\K重置匹配,以便从匹配中丢弃之前的所有内容,并且regex只匹配'

然后,可以用"替换它。

基于regex101的演示

更新

您可以避免在单词中匹配撇号,只匹配前面或后面有一个非单词字符的撇号:

代码语言:javascript
复制
(^[^#]*#|(?<!^)\G)[^'\n]*\K('(?=\W)|(?<=\W)')

基于regex101的演示

更新2

您还可以处理字符串中存在#字符的情况,方法是将正则表达式的第一部分限定为预先有匹配的引号对:

代码语言:javascript
复制
(?:^[^'#]*(?:'[^']*'[^#']*)*[^'#]*#|(?<!^)\G)[^'\n]*\K(?:'(?=\W)|(?<=\W)')

基于regex101的演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60131387

复制
相关文章

相似问题

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