防止正则表达式吞噬比赛的可选部分

时间:2017-04-26 23:48:17

标签: c# regex string

我的搜索范围很广,但我找不到简单的答案,而且我的正则表达式体验有限。我很欣赏一个解释的简单解决方案。

我有一个非常大的字符串,我需要替换它中的某些字,如下所示:

示例:无论您在哪里找到字符串“LINK-ABC”,都将其设为“LINK_ABC”。

我写了我的正则表达式匹配和替换字符串: @"LINK-ABC", @"LINK_ABC"它有效。

但有一些我没有认识到的事情。 文件中可能会出现如下文字:

  

LINK-ABC-DEF LINK-ABC-GHI-JKL ......等等。

所以我得到了“LINK_ABC-DEF”等(这不是我想要的;这应该保持原样......)

一旦我意识到问题,似乎我真正想要的只是识别匹配的单词并留下任何与其他东西结合的情况,不变。在我看来,如果我在匹配单词上检查了一个空格或句号,那应该这样做,所以......

@"LINK-ABC[ |\\.]",@"LINK_ABC"

......现在我跌跌撞撞了。

示例字符串:

  

link-xxx link-aaa-sss link-xxx-bbb link-xxx link-xxx。

匹配/替换字符串:

link-xxx[ |\\.],link_xxx

结果字符串:

  

link_xxxlink-aaa-sss link-xxx-bbb link_xxxlink_xxx

替换是正确的,但是尾随的逗号或句点已被“吞噬”,因此结果字符串错误。

有没有一种方法可以匹配,以便如果它在空间上匹配,替换将有一个空格,如果它匹配一段时间,替换将有一个句点?我想我可以做两个单独的比赛,但是我想增加对正则表达式的理解,如果可能的话,我会更优雅地做。

1 个答案:

答案 0 :(得分:0)

您应该能够通过“捕获群组”实现您想要的行为

var matchstring = @"link-xxx([ \.]|$)";
var fixstr = @"link_xxx$1";

matchstring最后一部分的括号将保留其中匹配的内容,$1中的fixstr将替换该组捕获的内容。

我还修改了你的标点符号部分,假设你想要替换一个匹配项,如果它恰好是输入中的最后一个字(通过添加|$)。字符类|中的[]是一个文字|字符,所以我删除了它,假设您实际上没有在输入中预期。