繁体   English   中英

正则表达式替换行首的任意多个匹配项

[英]Regex replace any number of matches at the start of the line

我有这种结构的文本:

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

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

您可以使用

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

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

细节

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

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

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

请参阅RegexStorm演示

尝试

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

它寻找一个数字序列\\d+后跟一个点\\. 前面带有任意数量的空格字符\\s* 反过来,在此行之前也不能在字母前加上正则表达式开头的负向后(?<![az].*)

在RegEx Storm上

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM