正则表达式在行的开头替换任意数量的匹配

use*_*967 5 c# regex replace

我有这种结构的文字:

1.  Text1
2.  Text 2. It has a number with a dot.
3.  1.   Text31
Run Code Online (Sandbox Code Playgroud)

我想得到这个文字:

# Text1
# Text 2. It has a number with a dot. (notice that this number did not get replaced)
## Text31
Run Code Online (Sandbox Code Playgroud)

我尝试了以下操作,但它不起作用

var pattern = @"^(\s*\d+\.\s*)+";
var replaced = Regex.Replace(str, pattern, "#", RegexOptions.Multiline);
Run Code Online (Sandbox Code Playgroud)

基本上,它应该在每一行的开头开始匹配,并用#符号替换每个匹配的组.目前,如果匹配多个组,则所有内容都将替换为单个#符号.我使用的模式可能不正确,任何人都可以提出解决方案吗?

Wik*_*żew 5

你可以用

(?:\G|^)\s*\d+\.
Run Code Online (Sandbox Code Playgroud)

它匹配字符串的开头或上一个成功匹配的结束或一行的开始,然后是零个或多个空格,一个或多个数字和一个点.

细节

  • (?:\G|^)- 字符串的开头或上一个匹配的结束(\G)或行的开头(^)
  • \s*-零个或多个空格,如果你想只匹配水平空格,以免溢出到下一个谎言(S)与替换[\s-[\r\n]]*[\p{Zs}\t]*)
  • \d+- 一个或多个数字(仅匹配ASCII数字,替换[0-9]+或将RegexOptions.ECMAScript选项传递给Regex构造函数)
  • \. - 一个点.

RegexOptions.Multiline必须将该选项传递给Regex构造函数才能^匹配行的开头.或者(?m)在模式的开头添加锚的内联版本.

有关\G锚点的更多详细信息,请参阅上一场比赛结束时的继续.

请参阅RegexStorm演示.