C#:Multiline TextBox的RegEx表达式

时间:2012-09-13 00:45:07

标签: c# regex line-breaks multiline

基本上,我试图在多行文本框中找到以下模式:

[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”。但我真的不明白。

再一次:Everting工作正常,即使模式在文本框中多次出现。问题是,当[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]

请原谅我的英语。我不是母语为英语的人。

谢谢。

这是代码,现在适合我。更改的内容是//已更改标记

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");
        }

    }

非常感谢你。

2 个答案:

答案 0 :(得分:0)

您需要指定单行选项

  

指定单行模式。更改点(。)的含义,使其匹配每个字符(而不是除\ n之外的每个字符)。

基本上您可能熟悉其他语言的“Dot-matches-all”选项。您设置的Multiline选项仅影响匹配行的开头和结尾的行为。有关详细信息,请参阅RegexOption class

Regex r = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Singleline);

您提供的正则表达式的另一个问题是*是贪婪的。所以[p] [/ p] [p] [/ p]将是一个匹配(它匹配在第一个[p]和最后一个[/ p]。将你的re5改为:

string re5 = "?";    // Non-greedy match on *

将解决这个问题,以便你获得两个单独的比赛。

答案 1 :(得分:0)

.匹配除换行符之外的任何字符。 \s将匹配空格和换行符。

(.|\s)*