gpt4 book ai didi

regex - 如何查找和替换特定字符,但前提是它在引号中?

转载 作者:行者123 更新时间:2023-12-03 23:42:33 25 4
gpt4 key购买 nike

问题:
我有成千上万的文档,其中包含我不想要的特定字符。例如。人物 a .这些文档包含多种字符,但 a我要替换的在双引号或单引号内。

我想找到并替换它们,我认为需要使用正则表达式。我正在使用 VSCode,但我愿意接受任何建议。

我的尝试:
我能够找到以下正则表达式来匹配包含 () 中的值的特定字符串.

".*?(r).*?"

然而,这只突出了整个报价。我只想突出角色。

欢迎任何解决方案,也许是正则表达式之外的解决方案。

示例结果:
给定,字符是 a , 查找替换为 b Somebody once told me "apples" are good for you => Somebody once told me "bpples" are good for you "Aardvarks" make good kebabs => "Abrdvbrks" make good kebabs The boy said "aaah!" when his mom told him he was eating aardvark => The boy said "bbbh!" when his mom told him he was eating aardvark

最佳答案

Visual Studio Code
VS Code 使用 JavaScript RegEx 引擎来实现其查找/替换功能。这意味着与 .NET 或 PCRE 等其他风格相比,您在使用正则表达式方面非常有限。
幸运的是,这种风格支持前瞻,并且通过前瞻,您可以查找但不能消耗字符。因此,确保我们在带引号的字符串中的一种方法是在匹配 a 后查找文件/主题字符串底部的引号数是否为奇数。 :

a(?=[^"]*"[^"]*(?:"[^"]*"[^"]*)*$)
Live demo
这寻找 a s 在双引号字符串中,用它代替单引号字符串替换所有 "' .你不能同时拥有两者。
然而,上面的正则表达式存在一个问题,它与双引号字符串中的转义双引号冲突。如果重要的话,也要匹配它们,你还有很长的路要走:
a(?=[^"\\]*(?:\\.[^"\\]*)*"[^"\\]*(?:\\.[^"\\]*)*(?:"[^"\\]*(?:\\.[^"\\]*)*"[^"\\]*(?:\\.[^"\\]*)*)*$)
将这些方法应用于大文件可能会导致堆栈溢出,所以让我们看看更好的方法。

I am using VSCode, but I'm open to any suggestions.


那太棒了。然后我建议使用 awksed或者为了实现你所追求的更程序化的东西,或者如果你能够使用 Sublime Text,就有机会以更优雅的方式解决这个问题。
崇高的文本
这应该适用于具有数十万行的大文件,但要注意它适用于单个字符(此处为 a ),经过一些修改也可能适用于单词或子字符串:
搜索:
(?:"|\G(?<!")(?!\A))(?<r>[^a"\\]*+(?>\\.[^a"\\]*)*+)\K(a|"(*SKIP)(*F))(?(?=((?&r)"))\3)
^ ^ ^
将其替换为: WHATEVER\3 Live demo
正则表达式分割 :
(?: # Beginning of non-capturing group #1
" # Match a `"`
| # Or
\G(?<!")(?!\A) # Continue matching from last successful match
# It shouldn't start right after a `"`
) # End of NCG #1
(?<r> # Start of capturing group `r`
[^a"\\]*+ # Match anything except `a`, `"` or a backslash (possessively)
(?>\\.[^a"\\]*)*+ # Match an escaped character or
# repeat last pattern as much as possible
)\K # End of CG `r`, reset all consumed characters
( # Start of CG #2
a # Match literal `a`
| # Or
"(*SKIP)(*F) # Match a `"` and skip over current match
)
(?(?= # Start a conditional cluster, assuming a positive lookahead
((?&r)") # Start of CG #3, recurs CG `r` and match `"`
) # End of condition
\3 # If conditional passed match CG #3
) # End of conditional
enter image description here
三步法
最后但并非最不重要的...
匹配引号内的字符很棘手,因为分隔符完全相同,因此如果不查看相邻的字符串,就无法区分开始和结束标记。您可以做的是将分隔符更改为其他内容,以便以后查找。
第1步:
搜索: "[^"\\]*(?:\\.[^"\\]*)*"替换为: $0Я第2步:
搜索: a(?=[^"\\]*(?:\\.[^"\\]*)*"Я)替换为您期望的任何内容。
第 3 步:
搜索: 用无替换以恢复一切。

关于regex - 如何查找和替换特定字符,但前提是它在引号中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48877459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com