C#Regex,用于没有';t以4个字符开头

本文关键字:4个 字符 开头 用于 C#Regex | 更新日期: 2023-09-27 18:08:22

我有一个基本模式:

Input = Regex.Replace(Input, "#(.+?)#", "<h3>$1</h3>");

现在我只想让它匹配,如果它所在的行不是以4个空格字符开头。例如:

This line #would match#
    #this one# wouldn't

我已经达到:

Input = Regex.Replace(Input, "^( {4}).?#(.+?)#", "<h3>$2</h3>");

但这似乎并不奏效;它不能正常更换。以下是一些测试数据:

#This is my header#
Some text, code below:
    background:#333333;
    background: #ffffff, #000000;
Testing text
#Another header#
Text

C#Regex,用于没有';t以4个字符开头

您可以使用否定的lookbacking来断言输入中没有出现四个空格,如下所示:

"(?<!^    )#(.+?)#"

但是,在应用正则表达式之前进行检查可能会更具可读性。

if (!Input.StartsWith("    "))
    Input = Regex.Replace(Input, "#(.+?)#", "<h3>$1</h3>");

为什么不简单地检查4个空间的存在?

 if(line.StartsWith("    "))
 {
     var text = line.Substring(4, line.Length - 4);
     text = "<h3>" + text + "</h3>";
 }
Input = Regex.Replace(Input, "^(?! {4})(.*?)#(.+?)#", "$1<h3>$2</h3>");

首先,断言该行不是以四个空格开头的:^(?! {4})

然后捕获所做的一切,如果它不是你真正匹配的东西:(.*?)

最后,在进行真正的替换之前,将初始字符(可以只是一个空字符串(插回:$1<h3>$2</h3>

您当前的正则表达式搜索以四个空格开头的行,这就是为什么它不起作用。

你可以通过负面展望来解决你的问题:

Input = Regex.Replace(Input, "^(?! {4})(.*)#(.+?)#", "$1<h3>$2</h3>");

这与从一开始(^(

  • 不以四个空间CCD_ 5开始
  • 直到#...#的剩余部分被捕获在组1 (.*)
  • #…#在第2组CCD_ 8中捕获
Input = Regex.Replace(Input, "(?<!''s{4})#(.+?)#", "<h3>$1</h3>");