【问题标题】:Regex replace any number of matches at the start of the line正则表达式替换行首的任意数量的匹配项
【发布时间】:2017-12-08 18:09:06
【问题描述】:

我有这种结构的文本:

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

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

【问题讨论】:

  • 该模式查找该模式的多次出现,因此 Replace 用一个“#”替换找到的所有出现。您可以使用循环来遍历更简单的正则表达式版本,例如 "^#*(\s*\d+\.\s*)" 并每次都替换它。这会花费一些 CPU,但可以得到你想要的。
  • 尝试将(?:\G|^)\s*\d+\.替换为#

标签: c# regex replace


【解决方案1】:

你可以使用

(?:\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。

【讨论】:

  • 似乎有效。您能否解释一下“?:\ G”部分或只是提供一些链接以供参考?
  • 我在手机上,写一个答案需要时间。我将添加细节。我试图发表此评论数十次,这里的连接很糟糕。
  • 在我看来,您也可以在这里使用基于后视的解决方案:(?<=^(?:\s*\d+\.)*)\s*\d+\.。但是,它的时间更长,效率也更低。
【解决方案2】:

试试

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

它查找一系列数字\d+,后跟一个点\.,前面是任意数量的空白字符\s*。反过来,这不得前面有一个字母,并在正则表达式的开头通过否定的后向查看(?&lt;![a-z].*) 进行检查。

Here at RegEx Storm.

【讨论】:

  • 我的例子不够清楚。我已对其进行了更新,并说明了为什么您的正则表达式也与我不需要的匹配。
  • 好的。编辑工作。但是当Wiktors在比赛中,我弃牌。关于\G - 见this。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多