PCRE正则表达式替换双引号内的文本模式

3
在Notepad++ 6.5.1中,我需要在引号对内替换某些模式。 我想将替换保存为宏的一部分,因此所有替换都需要在一个步骤中完成。
例如,在以下字符串中,将引号对内的所有'a'字符替换为破折号,同时保留引号对外的字符不变:
输入:aa"bbabaavv"kdjhas"bbabaavv"x 期望的结果:aa"bb-b--vv"kdjhas"bb-b--vv"x 请注意,引号是成对匹配的,因此kdjhas中的'a'是不受影响的。
到目前为止,我尝试搜索 (?:"[^"a]*|\G)\Ka([^"a]*) 并用 -$1 替换,但这只是简单地替换了所有的 a,结果为 --"bb-b--vv"kdjh-s"bb-b--vv"x。我正在尝试使用PCRE正则表达式,以便让我递归地替换引号限定的文本。
编辑:在引用的字符串中,引号用额外的引号进行转义,例如“”。但是,请假设我已经在之前的处理中用特殊字符替换了这些字符。 因此,这个问题的正则表达式解决方案将不必处理转义的引号。

请注意,引号是成对匹配的,因此 kdjhas 中的 'a' 不会受到影响。我不理解这个。在引用的字符串中是否有可能出现引号? - aliteralmind
好问题。答案是肯定的,但如果它们发生,它们将用另一个双引号来转义,例如“bla bla”“blub”“ blablabla”。 - John Dewey
@JohnDewey 相关,我认为可能是可行的,但会很麻烦。现在我很累,无法认真研究它(凌晨3点)... - HamZa
这是很多内容需要放入一个正则表达式中。你确定这不能通过宏来分解,以便可以分成多个步骤(多个正则表达式)来完成吗? - aliteralmind
@aliteralmind 是的,我已经清理干净了 - 请参见我上面的编辑。 - John Dewey
3个回答

1
很难确定是否可能,因为您只提供了一行输入文本。
但是假设输入遵循这个模式:
BOL|any text|string with two groups of a's|any text|string with two groups of a's|any text|EOL
    aa       "bbabaavv"                    kdjhas   "bbabaavv"                    x

我能够创建这个正则表达式搜索字符串:

^(.+?\".+?)([a]+)(.+?)([a]+)(.*?\")(.+?\".+?)([a]+)(.+?)([a]+)(.*?\".*)$

使用这个替换字符串:
\1-\3-\5\6-\8-\A

并将您的输入字符串转换为以下内容:

aa"bbabaavv"kdjhas"bbabaavv"x

变成这样:

aa"bb-b-vv"kdjhas"bb-b-vv"x

现在自然地,如果输入与描述的模式不同,那么搜索和替换将失败,因为搜索正在寻找两个引号字符串组内那四组a。
同时,我使用Zeus测试了该正则表达式,它可以创建具有超过9个组的正则表达式。
如您所见,该正则表达式需要10个组。
我不熟悉Notepad++,因此不知道它是否支持那么多组。

目标字符串不遵循固定模式,除了引号对之外。因此,我需要更一般的解决方案。例如,用 aa"bb-b-vv"kdjhas"c-b-b"blabla"foob-r"fud 替换 aa"bbabavv"kdjhas"cabab"blabla"foobar"fud。 - John Dewey
由于该模式不重复,我建议使用类似 SEDAWK 的工具进行搜索和替换。 - jussij

0

自问自答

我可能一直试图让Notepad++用正则表达式替换做到这一点,但是我想我找到了一个解决方法。

我尝试的实际任务涉及从Excel电子表格中创建一个SQL Server VALUES列表,我将选定的单元格复制并粘贴到Notepad++中。分隔符是\t和\r\n。但是,单元格也可以有换行符,这些换行符用"来界定。因此,我准备用<br>(或类似的内容)替换这些换行符,以便

"line1
line2"

在处理实际的行尾换行符之前,"line1<br>line2" 会变成 "line1<br>line2"

要让这样的解析可靠地工作,特别是当一个单元格中有两行以上时,可能对Notepad++的正则表达式能力要求过高。

因此,我想出了一个解决方法,似乎很有效:基本上,它从选择右侧的空白“虚拟”列开始,该列位于我的列选择右侧(如果我部分选择中间,则可以插入该列)。这将在每行末尾留下一个尾随的 \t,有效地将这些EOL与可能存在于文本单元格中的EOL分开,使我不必解析来自“...”字段的换行符。

因此,我从以下步骤编译了一个宏,似乎工作得很好:

  1. ' 替换为 ''
  2. \t\r\n 替换为 '\)\r\n, \('
  3. \t 替换为 ', '
  4. "" 替换为 ''
  5. " 替换为 <blank>
  6. ^ 替换为 \('(清理 - 仅针对第一行)
  7. ^,\('$ 替换为 <blank>(清理 - 仅限最后一行)

示例变换: 从

line1   line 2  
"line3
line3b
line3c" line 4  

('line1', 'line 2')
, ('line3
line3b
line3c', 'line 4')

现在可以轻松地将其修改为SELECT语句:

SELECT *
FROM (VALUES('line1', 'line 2')
, ('line3
line3b
line3c', 'line 4')
) t(a,b)

0
如果您的数据具有引号字符串可变数量的出现,则仅通过正则表达式在Notepad++提供的形式中执行替换是不可能的
要使用正则表达式进行替换,您需要在现有的正则表达式匹配中执行正则表达式查找。据我所知,Notepad++正则表达式中没有这样的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接