正则表达式替换多个段落(.Net)

时间:2009-07-02 18:17:24

标签: .net regex

自从我上次使用正则表达式以来已经有一段时间了,我有点急于完成某些事情,所以我希望我能快速回答这个快速的问题。

说我有以下文字:

Start
A
B
C
End    
Start
A
B
C
End Start
A
B
C
End
Foo
A
B
C
Bar

我想用管道替换换行符,但只在“开始”和“结束”字之间,以便我的最终结果是:

Start|A|B|C|End    
Start|A|B|C|End Start|A|B|C|End
Foo
A
B
C
Bar

非常感谢。

4 个答案:

答案 0 :(得分:5)

当你开始解析那样的表达式时,你就不再处于正则表达式领域了。与XML类似,您需要根据其上下文区别对待相同字符的表达式是一类高于正则表达式的语言。

在这种情况下,更直接地通过字符串戳的更传统的方法会更好。

假设原始字符串按照示例显示的空格分割,您可以在任何空格上拆分字符串,并在StartEnd令牌之间设置标记标记之间的管道而不是换行符。

答案 1 :(得分:1)

正则表达式:

(Start)[\n]*(A)[\n]*(B)[\n]*(C)[\n]*(End)

替换为:

$1|$2|$3|$4|$5

你可以为Start,End,A,B和C输入你自己的值甚至正则表达式。如果你告诉我你在使用什么,取决于你的语言/正则表达式引擎,替换为part可能会有所不同我可以更具体。

答案 2 :(得分:1)

这适用于您提供的案例。不能保证它适用于任何更复杂的事情。

class Program
{
    static void Main(string[] args)
    {
        string s = "Start" + Environment.NewLine +
                    "A" + Environment.NewLine +
                    "B" + Environment.NewLine +
                    "C" + Environment.NewLine +
                    "End" + Environment.NewLine +
                    "Start" + Environment.NewLine +
                    "A" + Environment.NewLine +
                    "B" + Environment.NewLine +
                    "C" + Environment.NewLine +
                    "End Start" + Environment.NewLine +
                    "A" + Environment.NewLine +
                    "B" + Environment.NewLine +
                    "C" + Environment.NewLine +
                    "End" + Environment.NewLine +
                    "Foo" + Environment.NewLine +
                    "A" + Environment.NewLine +
                    "B" + Environment.NewLine +
                    "C" + Environment.NewLine +
                    "Bar";

        Regex regex = new Regex(@"Start(\r\n[^\r\n(End)]*)*End", RegexOptions.Multiline);
        string replaced = regex.Replace(s, AddPipes);
        Console.WriteLine(replaced);
        Console.ReadLine();
    }

    static string AddPipes(Match m)
    {
        string x = m.ToString();
        return x.Replace("\r\n", "|");
    }
}

答案 3 :(得分:0)

我同意Welbog,我认为在这种情况下你可能会要求太多正则表达式。我建议采用2通方法。根据{{​​3}},以下内容将与您的仲裁长度

的目标段落相匹配
(Start)(\r\n)((.*)\2)+?(End)

我会使用上面的正则表达式来提取文本中的匹配段落,然后使用简单的正则表达式或字符串替换函数将Cr Lf字符交换为管道。