【问题标题】:Prevent Regex from devouring optional part of the match防止正则表达式吞噬匹配的可选部分
【发布时间】:2017-04-26 23:48:16
【问题描述】:

我进行了广泛的搜索,但找不到简单的答案,而且我的正则表达式经验有限。我很感激一个简单的解决方案,请解释一下。

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

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

我写了我的正则表达式匹配和替换字符串: @"LINK-ABC", @"LINK_ABC" 并且成功了。

但是有几件事我没有意识到。 文件中可能有这样的词:

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

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

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

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

...现在我绊倒了。

示例字符串:

link-xxx 链接-aaa-sss 链接-xxx-bbb 链接-xxx 链接-xxx.

匹配/替换字符串:

link-xxx[ |\\.],link_xxx

结果字符串:

link_xxxlink-aaa-sss 链接-xxx-bbb 链接_xxxlink_xxx

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

有没有一种方法可以匹配,如果它在空格上匹配,则替换将有一个空格,如果它在句点上匹配,则替换将有一个句点?我想我可以做 2 场单独的比赛,但我想增加我对 Regex 的理解,如果可能的话,做得更优雅。

【问题讨论】:

  • 必须是正则表达式吗?
  • 还有,这和 Python 有什么关系?
  • 请将实际代码和测试字符串放入格式化块中,我的老眼无法解码内联乱码
  • @Mr, Zander:是的,它需要是正则表达式。作为一名程序员,我可以编写自己的解决方案并自己完成这个过程,但我认为重新发明轮子没有任何意义,我想了解更多信息,所以我很想看看 Regex-有经验的人可以想出。添加 Python 标签是因为有人告诉我 python 和 C# 非常相似,Python 社区中的某个人可能知识渊博。
  • @Mad Myche:这里是代码:OUTFile = Regex.Replace(OUTFile, matchstring, fixstr, RegexOptions.IgnoreCase);

标签: c# regex string


【解决方案1】:

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

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

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

我还稍微修改了您的标点符号部分,假设您想要替换匹配项,如果它恰好是输入中的最后一个单词(通过添加|$)。字符类 [] 中的 | 是文字 | 字符,因此我删除了它,假设您实际上并不期望在输入中出现这种情况。

【讨论】:

  • 非常感谢。这正是我一直在寻找的优雅,并且我提高了对正则表达式的了解。真的很感谢你的麻烦。再次感谢。我不确定如何将此标记为答案,但我一定会尝试支持您的回复。
  • (好的,设法找出支持并标记为答案,但我没有足够的积分来支持你。再次感谢;这是一个非常好的解决方案
猜你喜欢
  • 1970-01-01
  • 2012-07-14
  • 2011-06-13
  • 1970-01-01
  • 2017-11-29
  • 2017-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多