我有这种结构的文字:
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);
基本上,它应该在每一行的开头开始匹配,并用#符号替换每个匹配的组。目前,如果匹配多个组,则所有内容都将替换为单个#符号。我使用的模式可能不正确,任何人都可以提出解决方案吗?
答案 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].*)
检查。