为什么我的正则表达式不能在C#中工作,而在其他文本编辑器中工作?

时间:2019-04-30 11:50:25

标签: c# .net regex

我有一个正则表达式如下:

模式:<navPoint id="navPoi[^"]+" playOrder="[^"]+"><navLabel><text>([^<>\r\n]+)</text></navLabel><content src="([^<>\r\n]+)"/>$

替换:<li id="NavPoint-#"><a href="$2">$1</a>\r\n<ol>

它可以在普通编辑器甚至regex101中使用:Demo with Input

我想用C#编写相同的内容,但是当我这样做时,它将无法正常工作。我在做错什么吗?

这是我的代码:

string secondPattern = @"<navPoint id=""navPoi[^""]+"" playOrder=""[^""]+""><navLabel><text>([^<>\n]+)<\/text><\/navLabel><content src=""([^<>\n]+)""\/>$";
string secondSubstitution = @"<li id=""NavPoint-#""><a href=""$2"">$1</a>\r\n<ol>";
Regex secondRegex = new Regex(secondPattern, options);
string anotherNavMap = secondRegex.Replace(newNavMap, secondSubstitution);

1 个答案:

答案 0 :(得分:1)

您应该确保将RegexOptions.Multiline选项传递给regex编译,并在行锚的$末尾之前允许CR,因为在多行模式下$仅在LF符号之前匹配

另外,@"\r\n"是4个字符的字符串,如果您需要CRLF换行符,请使用"\r\n",因为逐字字符串文字不支持字符串转义序列。

这是一个代码修复程序:

string secondPattern = @"<navPoint id=""navPoi[^""]+"" playOrder=""[^""]+""><navLabel><text>([^<>\n]+)</text></navLabel><content src=""([^<>\n]+)""/>\r?$";
string secondSubstitution = "<li id=\"NavPoint-#\"><a href=\"$2\">$1</a>\r\n<ol>";
Regex secondRegex = new Regex(secondPattern, RegexOptions.Multiline);
string anotherNavMap = secondRegex.Replace(newNavMap, secondSubstitution);