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

Replace last occurences of string in lines between two strings

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

示例文本:

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\:\:).

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

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

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

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

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

并替换为:

&ThisClass::

RegEx Demo

正则表达式详细信息:

  • \G 断言位置在前一个匹配的末尾或第一个匹配的字符串的开头。通过放置否定前瞻 (?!\A),我们确保 \G 在字符串的开头不匹配。
  • \K 重置报告比赛的起点。
  • Lookahead 条件最后 (?=...) 是为了确保我们前面有 END_MESSAGE_MAP