C#Regex表示不';不要从4个字符开始

C#Regex表示不';不要从4个字符开始,c#,regex,C#,Regex,我有基本的模式: Input = Regex.Replace(Input, "#(.+?)#", "<h3>$1</h3>"); 我已经做到了: Input = Regex.Replace(Input, "^( {4}).?#(.+?)#", "<h3>$2</h3>"); 为什么不简单地检查是否存在4个空格 if(line.StartsWith(" ")) { var text = line.Substring(4, li

我有基本的模式:

Input = Regex.Replace(Input, "#(.+?)#", "<h3>$1</h3>");
我已经做到了:

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

为什么不简单地检查是否存在4个空格

 if(line.StartsWith("    "))
 {
     var text = line.Substring(4, line.Length - 4);
     text = "<h3>" + text + "</h3>";
 }
if(line.StartsWith(“”)
{
var text=line.Substring(4,line.Length-4);
text=”“+text+”;
}

您可以使用负回溯来断言输入中没有出现四个空格,如下所示:

"(?<!^    )#(.+?)#"
(?$1”);
当前正则表达式搜索以四个空格开头的行,这就是它不起作用的原因

您可以通过消极前瞻来解决您的问题:

Input = Regex.Replace(Input, "^(?! {4})(.*)#(.+?)#", "$1<h3>$2</h3>");
Input=Regex.Replace(输入,“^(?{4})(.*)#(.+?)#,“$1$2”);
这与从一开始(
^
)的行相匹配

  • 不要以四个空格开始
    (?!{4})
  • 在组1
    (*)
  • #在第2组
    #(.+?)#
    中捕获到
Input=Regex.Replace(输入,“^(?!{4})(.*?)(.+?)#,“$1$2”);
首先,断言该行不以四个空格开头:
^(?!{4})

然后捕获它所做的一切,如果它不是您实际匹配的内容:
(.*)

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

Input=Regex.Replace(Input,(?$1”);

这与原始代码做的事情不同,但想法是好的。您似乎想隔离/防止替换此“背景:
#ffffff,#
000000;”。但标准充其量也很弱。依靠四个空格来防止此情况并添加标记需要非常严格的格式。如果是这样,则这是可以的。否则,唯一可靠的东西是像这样的东西,
s~^\s*\\\\\([^\\\\\n]*)\\\\\\\\s*$~$1~
。即使这需要严格的格式。在磅符号之间的
限定条件上必须有很大的限制(我的意见)。
"(?<!^    )#(.+?)#"
if (!Input.StartsWith("    "))
    Input = Regex.Replace(Input, "#(.+?)#", "<h3>$1</h3>");
Input = Regex.Replace(Input, "^(?! {4})(.*)#(.+?)#", "$1<h3>$2</h3>");
Input = Regex.Replace(Input, "^(?! {4})(.*?)#(.+?)#", "$1<h3>$2</h3>");
Input = Regex.Replace(Input, "(?<!\\s{4})#(.+?)#", "<h3>$1</h3>");