c#regex - 更改模式匹配,直到找到特定单词

时间:2015-08-07 22:55:53

标签: c# regex

通常我可以解决方法并让自己完成所有工作,但这个有点棘手,甚至msdn引用和示例混淆不仅仅是帮助。 我测试了一些代码并坚持混合捕获分组以便与非捕获组进行更改,以便在我希望时停止匹配

我想要更改的更简单的代码是:

stats = "label:100,value:7878,label:110,value:7879,something,label:200,value:8888";

valor = "value:8080";

我知道我是否使用

pattern = @"value:(\d+)";

我可以将每个值编号更改为8080

Regex.Replace(stats, pattern, valor);

但我需要他在找到'某事'字符串时停止更改这些

我设法将每个字母变为'勇敢',直到他找到'某事'使用

pattern = @"^(?:(?!something).)*";

有没有办法只将'value:(\ d +)'数字改为'valor',再加上?:(?!something)来停止同一句话中的匹配? 我已经看过很多例子,但他们从来没有说过这样的话,所以我不知道是否有可能同时合并这两个条件

1 个答案:

答案 0 :(得分:1)

您可以使用后备解决方案,确保在值之前没有something

(?<!\bsomething\b.*)value:\d+

请参阅demo

请注意,由于something字边界,\b与整个字匹配。

替换操作的结果:

enter image description here

请注意(?:(?!something).)效率非常低,应该在没有其他方法有效时使用。在.NET中,有一个强大的可变宽度后视,这是此任务的正确工具。

另请注意,如果您不使用捕获组反向引用,则不需要在模式中捕获这些组(我从\d+左右删除括号。)