Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则表达式来查找字符串中的重复模式_C#_Regex_String_Str Replace - Fatal编程技术网

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*)-