1

类似于我昨天的问题: C# Regex Pattern Conundrum

同样的问题,不同的正则表达式模式。在http://sourceforge.net/projects/regextester/http://www.RegexLib.com中测试时,正则表达式模式返回所需的匹配 但是,当在 .NET 中执行模式时,没有返回匹配。

string SampleText = @"\r\n99. Sample text paragraph one.\r\n100. Sample text here paragraph two.\r\n101. Sample text paragraph three.\r\n";
string RegexPattern = @"(?<=\\r\\n\d+\.\s)([^.]+?)here.*?(?=\\r\\n)";
Regex FindRegex = new Regex(@RegexPattern, RegexOptions.Multiline | RegexOptions.Singleline);
Match m = FindRegex.Match(SampleText);

所需的匹配项是“此处的示例文本第 2 段”。

和昨天一样,我不确定问题是我的正则表达式模式还是我的代码。

4

2 回答 2

7

您还需要转义特殊的正则表达式字符:

string RegexPattern = @"(?<=\\r\\n\d+\.\s)([^.]+?)here.*?(?=\\r\\n)";

或者:

string RegexPattern = "(?<=\\\\r\\\\n\\d+\\.\\s)([^.]+?)here.*?(?=\\\\r\\\\n)";

不要忘记 - 您处于 C# 字符串上下文中,因此您需要确保将正确的字符串传递给正则表达式引擎。

于 2013-03-08T15:51:08.333 回答
0

我想到了。

在 RegexTester 和 RegexLib.com 中进行测试时,我从立即窗口复制并粘贴了我的源文本,该窗口将控制返回换行符转换为它们的文本表示形式 \r\n。

所以,我的正则表达式在测试环境中工作。但是,在实际运行时,源文本包含控制返回换行符,而不是 \r\n 作为文本。这就解释了为什么我的模式在测试环境中有效,但在运行时无效。

我改变了我的模式@"(?<=\n\d+\.\s)([^.]+?)here.*?(?=\n)",它工作得很好。

尴尬的实现。感谢您的帮助奥德。

于 2013-03-08T16:13:14.177 回答