C# 正则表达式来查找字符串中的重复模式
下面是我正在使用的示例字符串:C# 正则表达式来查找字符串中的重复模式,c#,regex,string,str-replace,C#,Regex,String,Str Replace,下面是我正在使用的示例字符串: --一些文本后面跟着more--more-- 我需要在行首找到每个出现的-,并替换为另一个字符。因此,如果将-替换为~,最终结果将是 ~~~一些文本后面跟着更多-,后面跟着更多- 我尝试了(-)?,它选择了所有-。如果我放一个^来表示行的开头,我只得到第一个'-'。如果我将模式设为^((-){3},它选择了组,但是组可以是开头的任意数量的-,因此,--有些文本是有效的和-有些文本是有效的和--有些文本是有效的有几种方法:从上一个匹配(\G)的开始或结束(-)匹配任
--一些文本后面跟着more--more--
我需要在行首找到每个出现的
-
,并替换为另一个字符。因此,如果将-
替换为~
,最终结果将是~~~一些文本后面跟着更多-,后面跟着更多-
我尝试了
(-)?
,它选择了所有-
。如果我放一个^
来表示行的开头,我只得到第一个'-'。如果我将模式设为^((-){3}
,它选择了组,但是组可以是开头的任意数量的-
,因此,--有些文本是有效的
和-有些文本是有效的
和--有些文本是有效的
有几种方法:从上一个匹配(\G
)的开始或结束(-
)匹配任何0+非单词字符,并捕获它们(使用(…)
),然后匹配-
,并用替换字符(~
)替换为对第一个捕获组的反向引用($1
):
看
或者,匹配字符串(^
)开头的所有1个或多个非单词字符(\W+
),并仅在以下位置将-
替换为~
:
var res = Regex.Replace(s, @"^\W+", m => m.Value.Replace("-","~"));
见:
或者,您可以利用可变宽度查找:
(?<=^\W*)-
(?这里的“行首”是什么意思?第一个单词char?因此重复模式应该是-
(带有空格或唯一字符)?如^(-)+
?^(-\s*))+
似乎很接近你想要的。@WiktorStribiżew,是的,第一个character@JMichelB,重复的模式只是“-”。非常感谢!这正是我要找的。不过,我不得不说,我要花一些时间来解释这个表达!如果你不介意,你能提供更多的解释吗?我实际上给出了一个对每个正则表达式的描述性解释。非单词字符是除字母、数字、\uu
和其他一些罕见字符以外的任何字符。顺便说一句,第一个正则表达式甚至可以在PCRE中工作-请参见。\G
锚点匹配字符串的开头或前一个匹配位置的结尾。[^\w-]*
匹配除word和-
字符以外的零个或多个字符。^\W+
是基本字符-字符串开头(^
),后跟1+非单词字符。(?我可以在@Wiktor上查找文档,但是如果您在文档上添加一个小注释,那将非常有用。我仍在学习正则表达式。我在描述中添加了正则表达式位。您好Wiktor,如果我真的想用\u2013替换“-”,即utf-8字符的破折号,那么m.Value.Replace会是什么样子?
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 - -
(?<=^\W*)-