C#Regex在有或没有新行的情况下匹配

时间:2015-08-06 15:41:01

标签: c# regex

我正在尝试在两个分隔符[% %]之间匹配文本,我想知道字符串是否包含新行。

代码

string strEmailContent = sr.ReadToEnd();
string commentPatt = @"\[%((\r\n?|\n).*(\r\n?|\n))%\]";
Regex commentRgx = new Regex(commentPatt, RegexOptions.Singleline);

示例输入

//Successful
[%
  New Comment
%] other content from input

//Match: [%\r\nNew Comment\r\n%]

//Fail
[% New Comment %]

//Match: false

//Successfully match single line with
string commentPatt = @"\[%(.*)%\]";

//Match: [% New Comment %]

我不知道如何将这两种模式结合起来以匹配这两种情况。任何人都可以提供任何帮助吗?

2 个答案:

答案 0 :(得分:1)

尝试这种模式:

\[%([^%]*)%\]

它捕获" [%"之间的所有字符。和" %]"那不是" %"字符。

经过测试@ Regex101

如果你想"看" " \r\n"在您的搜索结果中,您必须使用String.Replace()转义它们。

请参阅Fiddle Demo

答案 1 :(得分:1)

要在两个分隔符之间获取文本,您需要将延迟匹配.*?一起使用,但为了匹配换行符号,还需要(?s)单行修饰符,以便点可以也匹配换行符号:

(?s)\[%(.*?)%]

请注意,即使(?s)\[%(.*?)%]位于%内,[%...%]也会匹配。

regex demo。请注意,]不必转义,因为它位于一个明确的位置,只能被解释为文字]

在C#中,您可以使用

var rx = new Regex(@"(?s)\[%(.*?)%]");
var res = rx.Matches(str).Cast<Match>().Select(p => p.Groups[1].Value).ToList();