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