我有这种结构的文本:
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
正则表达式构造函数的选项)\.
- 一个点。
必须将 RegexOptions.Multiline
选项传递给 Regex 构造函数,以使 ^
匹配一行的开头。或者在模式的开头添加 anchor 的内联版本 (?m)
。
有关\G
anchor 的更多详细信息,请参阅Continuing at The End of The Previous Match .
参见 RegexStorm demo .
关于c# - 正则表达式替换行首的任意数量的匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44920027/