在Notepad ++ 6.5.1中,我需要替换引号对中的某些模式。我想将替换保存为宏的一部分,因此所有替换都需要一步完成。
例如,在以下字符串中,替换所有' a'带引号的引号对中的字符,同时保留引号对之外的字符不变:
输入:aa"bbabaavv"kdjhas"bbabaavv"x
期望的结果:aa"bb-b--vv"kdjhas"bb-b--vv"x
请注意,引号是成对匹配的,因此' a'在kdjhas
中未被触及。
到目前为止,我尝试搜索(?:"[^"a]*|\G)\Ka([^"a]*)
并替换为 - $ 1,但这只是替换了所有的a,结果为--"bb-b--vv"kdjh-s"bb-b--vv"x
。我试用PCRE正则表达式,让我递归替换引号分隔的文本。
修改:带引号的字符串中的引号标记会使用额外引号进行转义,例如: "&#34 ;.但是,假设我已经在一个特殊字符的前一个传递中替换了这些。因此,针对此问题的正则表达式解决方案将不必处理转义引用。
答案 0 :(得分: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测试了regexp,它可以创建超过9组的正则表达式。
正如您所看到的,正则表达式需要10个组。
我不熟悉Notpad ++所以我不知道它是否支持那么多组。
答案 1 :(得分:0)
<强>自应答强>
我可能一直在试图让Notepad ++做这个正则表达式取代,但我觉得我找到了一个解决方法。
我尝试的实际任务是从Excel电子表格创建SQL Server VALUES列表,我在那里将所选单元格复制并粘贴到Notepad ++中。分隔符是\ t和\ r \ n。但是,单元格也可以有换行符,这些换行符由“。所以,我打算用<br>
(或类似的东西)替换这些换行符,以便
"line1
line2"
在处理实际行尾行换行之前,将变为"line1<br>line2"
。
让这样的解析工作可靠,特别是当单个单元格中有两行以上时,可能已经过多地询问Notepad ++的正则表达式功能。
所以我提出了一个似乎有效的解决方法:)基本上它首先选择我的列选择右侧的空白“虚拟”列(如果我从中间部分选择,我可以插入) 。这将在每行的末尾留下一个尾随\ t,这有效地将这些EOL与文本单元格中可能存在的EOL区分开来,从而使我不必解析来自“...”字段的换行符。
所以我从以下步骤中编译了一个宏,这似乎运作良好:
'
替换为''
\t\r\n
替换为'\)\r\n, \('
\t
替换为', '
""
替换为''
"
替换为<blank>
^
替换为\('
(清理 - 仅限第一行)^, \('$
替换为<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)
答案 2 :(得分:0)
如果您的数据具有可变数量的引用字符串,则不可能仅通过正则表达式执行替换,至少以Notepad ++提供的形式执行替换。
要使用正则表达式替换,您需要在现有的正则表达式匹配中执行正则表达式查找。据我所知,Notepad ++正则表达式中没有这样的功能。