替换两个字符串之间的行中最后一次出现的字符串

时间:2019-07-18 14:13:31

标签: regex replace pcre

我正在尝试构建一个正则表达式,以使我能够替换两个特定字符串之间多行上的最后一个逗号。

示例文字:

BEGIN_MESSAGE_MAP(SomeForm, BaseForm)
    ON_COMMAND(CID_ButtonAction, OnButtonAction)
    ON_NOTIFY_EX(CID_Notify, 0, OnNotify)
END_MESSAGE_MAP()

所需的输出:

BEGIN_MESSAGE_MAP(SomeForm, BaseForm)
    ON_COMMAND(CID_ButtonAction, &ThisClass::OnButtonAction)
    ON_NOTIFY_EX(CID_Notify, 0, &ThisClass::OnNotify)
END_MESSAGE_MAP()

替换一行中的最后一个逗号很容易:

找到(,)([^,]*?)$

并替换为(?1,&ThisClass\:\:\2)

我还能够构建匹配BEGIN_MESSAGE_MAPEND_MESSAGE_MAP之间的所有内容的正则表达式。

(?<=BEGIN_MESSAGE_MAP)(.*\R)*(?=END_MESSAGE_MAP)

问题是-如何将这两个字符串放在一起,以便只能在这两个字符串之间进行替换?

1 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式进行搜索:

(?:^\h*BEGIN_MESSAGE_MAP|(?!\A)\G)(?:.*\R)+?.*\K(,\h*)(?=(?:.*\R)+^END_MESSAGE_MAP)

并替换为:

$1&ThisClass::

RegEx Demo

RegEx详细信息:

  • \G在上一场比赛的末尾或首场比赛的字符串开头声明位置。通过将否定的前瞻(?!\A)放在字符串的开头,我们确保\G不匹配。
  • \K重置报告的比赛的起点。
  • (?=...)结尾的前瞻性条件是确保我们前面有END_MESSAGE_MAP