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

时间:2014-04-14 00:35:00

标签: regex notepad++ pcre

在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 ;.但是,假设我已经在一个特殊字符的前一个传递中替换了这些。因此,针对此问题的正则表达式解决方案将不必处理转义引用。

3 个答案:

答案 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区分开来,从而使我不必解析来自“...”字段的换行符。

所以我从以下步骤中编译了一个宏,这似乎运作良好:

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

    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 ++正则表达式中没有这样的功能。