正则表达式替换行开头

时间:2017-07-05 07:47:33

标签: c# regex replace

我有这种结构的文字:

1.  Text1
2.  Text 2. It has a number with a dot.
3.  1.   Text31

我想得到这个文字:

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

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

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

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

2 个答案:

答案 0 :(得分:5)

您可以使用

(?:\G|^)\s*\d+\.

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

<强>详情

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

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

有关\G锚点的详细信息,请参阅Continuing at The End of The Previous Match

请参阅RegexStorm demo

答案 1 :(得分:0)

尝试

(?<![a-z].*)\s*\d+\.

它会查找一系列数字\d+,后跟一个点\.,前面有任意数量的空白字符\s*。反过来,必须前面有一个字母,在正则表达式的开头由负面的后视(?<![a-z].*)检查。

Here at RegEx Storm