正则表达式在字符串中查找重复模式

时间:2017-11-07 22:05:55

标签: c# regex string str-replace

以下是我正在使用的示例字符串:
- - - some text followed by more - - followed by more - -
我需要在行的开头找到-的每次出现,并替换为另一个字符。因此,如果要将-替换为~,则最终结果将为
~ ~ ~ some text followed by more - - followed by more - -

我尝试了(-).?,选择了所有-。如果我用^表示行的开头,我只得到第一个' - '。如果我将模式设为^((-)\s){3},选择该组,但该组在开头可以是任意数量的-,那么为- - some text is valid
- some text is valid
- - - - some text is valid

1 个答案:

答案 0 :(得分:4)

有几种方法:从上一场比赛的开始或结束(-)匹配除[^\w-]*\G)以外的任何0 +非单词字符并捕获它们(使用(...)),然后匹配-并使用替换字符($1)替换为第一个捕获组(~)的反向引用:

var res = Regex.Replace(s, @"\G([^\w-]*)-", "$1~");

请参阅regex demo

或者,在字符串开头(\W+)匹配所有1个或多个非字符字符{^),并将-替换为~

var res = Regex.Replace(s, @"^\W+", m => m.Value.Replace("-","~"));

请参阅C# demo

var s = "- - - some text followed by more - - followed by more - - ";
var res = Regex.Replace(s, @"^\W+", m => m.Value.Replace("-", "~"));
Console.WriteLine(res); 
// => ~ ~ ~ some text followed by more - - followed by more - - 

或者,您可以利用可变宽度lookbehind:

(?<=^\W*)-

替换为~。见this regex demo(?<=^\W*) lookbehind仅在-匹配时才会出现customer#application.war 匹配,前提是字符串开头的前缀为0 +非字符。