[英]C#: RegEx Expression for Multiline TextBox
基本上,我试图在多行文本框中找到以下模式:
[p] anyword bla bla anyword [/ p]
1.)模式可以在文本框中出现n次,我也希望找到n次。
2.)[p]和[/ p]之间可以是任何字符,包括空格和换行符(在C#中为“ \\ r \\ n”)
3.)我想要整个模式,包括[p]和[/ p]
下面的代码非常接近我想要的结果。 问题是,[p]和[/ p]之间可能会出现多个换行符。 我已经尝试了许多解决方案。 什么都没有为我工作。
private void getTextFromTag2(String Tag, String txt)
{
txt = txt.Replace("\r", "");
string re1 = "(\\[";
string re2 = "p";
string re3 = "\\]";
string re4 = ".*"; // Here lies the problem
string re5 = ""; // Left open for a solution => \r\n cann occur n-times
string re6 = "\\[";
string re7 = "\\/";
string re8 = "p";
string re9 = "\\])";
Regex r = new Regex(re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9, RegexOptions.IgnoreCase | RegexOptions.Multiline);
MatchCollection mc = r.Matches(txt, 0);
foreach (Match match in mc)
{
String c1 = match.Groups[1].ToString();
Console.Write(c1 + "\r\n");
}
}
如您所见,我已经在txt中用“”替换了“ \\ r”,因为.NET的RegEx引擎似乎只希望将“ \\ n”用作换行符。
我认为,我的代码中的问题是在re4和re5中发现的。 只要没有换行符,re4都能找到任何字符并运行良好。
我认为re4应该说“任何字符,包括空格和\\ n”。 但是我真的不明白。
再次重申:即使模式在文本框中多次出现,Evering也可以正常工作。 问题是,当[p]和[/ p]之间出现换行符时
这是一个不起作用的例子
[p]BlaBla BlaBla \r\n
BlaBla BlaBla \r\n
\r\n
BlaBla
[/p]
这是一个可行的例子
[p]BlaBla BlaBla[/p]
\r\n
\r\n
[p]Even more BlaBla[/p]
\r\n
\r\n
[p]Much more BlaBla[/p]
请原谅我的英语。 我不是英语母语人士。
谢谢。
这是代码,现在对我有用。 更改的内容是// Changed Tagged
private void getTextFromTag2(String Tag, String txt)
{
//txt = txt.Replace("\r", ""); //Changed
string re1 = "(\\[";
string re2 = "p";
string re3 = "\\]";
string re4 = ".*";
string re5 = "?"; // Changed
string re6 = "\\[";
string re7 = "\\/";
string re8 = "p";
string re9 = "\\])";
Regex r = new Regex(re1 + re2 + re3 + re4 + re5 + re6 + re7 + re8 + re9, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Singleline); //Changed
MatchCollection mc = r.Matches(txt, 0);
foreach (Match match in mc)
{
String c1 = match.Groups[1].ToString();
Console.Write(c1 + "\r\n");
}
}
非常感谢。
您需要指定“单行”选项
指定单行模式。 更改点(。)的含义,使其匹配每个字符(而不是\\ n以外的每个字符)。
基本上,您可能会从其他语言中熟悉“全部匹配”选项。 您设置的“多行”选项仅影响匹配行的开头和结尾的行为。 有关更多详细信息,请参见RegexOption类 。
Regex r = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Singleline);
您提供的正则表达式的另一个问题是*
is greedy。 因此[p] [/ p] [p] [/ p]将是单个匹配项(它在第一个[p]和最后一个[/ p]上匹配。将re5更改为:
string re5 = "?"; // Non-greedy match on *
将解决此问题,以便您获得两个单独的比赛。
.
匹配除换行符以外的任何字符。 \\s
将匹配空格和换行符。
(.|\s)*
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.