我正在尝试构建一个正则表达式,以使我能够替换两个特定字符串之间多行上的最后一个逗号。
示例文字:
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_MAP
和END_MESSAGE_MAP
之间的所有内容的正则表达式。
(?<=BEGIN_MESSAGE_MAP)(.*\R)*(?=END_MESSAGE_MAP)
问题是-如何将这两个字符串放在一起,以便只能在这两个字符串之间进行替换?
答案 0 :(得分:2)
您可以使用此正则表达式进行搜索:
(?:^\h*BEGIN_MESSAGE_MAP|(?!\A)\G)(?:.*\R)+?.*\K(,\h*)(?=(?:.*\R)+^END_MESSAGE_MAP)
并替换为:
$1&ThisClass::
RegEx详细信息:
\G
在上一场比赛的末尾或首场比赛的字符串开头声明位置。通过将否定的前瞻(?!\A)
放在字符串的开头,我们确保\G
不匹配。\K
重置报告的比赛的起点。(?=...)
结尾的前瞻性条件是确保我们前面有END_MESSAGE_MAP
。