c# - 为什么我的正则表达式在 C# 中不起作用,但在其他文本编辑器中起作用?

标签 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);

最佳答案

您应该确保将 RegexOptions.Multiline 选项传递给正则表达式编译,并在 $ 行尾 anchor 之前允许 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);

关于c# - 为什么我的正则表达式在 C# 中不起作用,但在其他文本编辑器中起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55920342/

相关文章:

c# - .Net Core 3.0 Angular SSR 项目未运行

带有 DataGrid 的 WPF 应用程序中的 C# 搜索框

c# - 捕获 TaskCanceledException 并检查 Task.Canceled 是个好主意吗?

c# - 为什么我必须显式提供泛型参数类型而编译器应该推断类型?

c# - Windows 服务未记录到事件日志

Firefox 扩展中的 Javascript 正则表达式

c# - C#中结构变量的存储方式

c# - 如何有条件地避免属性在 WCF 中序列化?

javascript - 替换第一个括号 - (到最后一个)中所有出现的 ('content' ) 吗?

regex - Bash - grep 提取以指定字符串结尾的单词;在找不到匹配项的地方留下空格