代码之家  ›  专栏  ›  技术社区  ›  Priyank Bolia

C[重复]中的多行正则表达式

  •  19
  • Priyank Bolia  · 技术社区  · 15 年前

    如何在多行模式下使用正则表达式匹配和替换文本?

    我知道 RegexOptions.Multiline 选项,但是指定“全部匹配”C中的新行字符的最佳方法是什么?

    输入:

    <tag name="abc">this
    is
    a
    text</tag>
    

    输出:

    [tag name="abc"]this
    is
    a
    test
    [/tag]
    

    啊,我发现了真正的问题。”®ex中的amp;'和';'在一行中匹配文本,而在regex中需要转义相同的文本,以便在也有新行的情况下工作。

    2 回复  |  直到 6 年前
        1
  •  48
  •   Ian Kemp    6 年前

    如果你是说那里 为表达式匹配的换行符,然后 \n 会帮你的。

    否则,我想你可能误解了 Multiline / Singleline 旗帜。如果希望表达式跨多行匹配,则实际需要使用 RegexOptions.Singleline . 它的意思是将整个输入字符串视为一行,从而忽略换行符。这就是你想要的……?

    例子

    Regex rx = new Regex("<tag name=\"(.*?)\">(.*?)</tag>", RegexOptions.Singleline);
    String output = rx.Replace("Text <tag name=\"abc\">test\nwith\nnewline</tag> more text...", "[tag name=\"$1\"]$2[/tag]");
    
        2
  •  12
  •   Andomar    15 年前

    这是要匹配的正则表达式。它需要 RegexOptions.Singleline 选项,使 . 匹配换行符。

    <(\w+) name="([^"]*)">(.*?)</\1>
    

    在这个regex之后,第一个组包含标记,第二个组包含标记名,第三个组包含标记之间的内容。因此替换字符串可能如下所示:

    [$1 name="$2"]$3[/$1]
    

    在c中,如下所示:

    newString = Regex.Replace(oldString, 
        @"<(\w+) name=""([^""]*)"">(.*?)</\1>", 
        "[$1 name=\"$2\"]$3[/$1]", 
        RegexOptions.Singleline);