代码之家  ›  专栏  ›  技术社区  ›  epitka

regex:获取介于[%=和%]之间的内容

  •  0
  • epitka  · 技术社区  · 15 年前

    有人能帮我弄到一个介于[%=和%]之间的内容吗?

    6 回复  |  直到 15 年前
        1
  •  2
  •   Mark Byers    15 年前

    如果不能嵌套标记,则可以使用以下正则表达式:

    \[%=(.*?)%]
    

    这些符号的含义如下:

    \[    Match a literal [ character. The backslash is required otherwise [ would
          start a character class.
    %=    Match %=
    (.*?) Match any characters, non-greedy. i.e. as few as possible. The parentheses
          capture the match so that you can refer to it later.
    %]    Match %] - Note that it is not necessary to escape ] here, but you can if
          you want.
    

    以下是如何在C_中使用它:

    string s = "sanfdsg[%=jdgashg%]jagsklasg";
    Match match = Regex.Match(s, @"\[%=(.*?)%]");
    if (match.Success)
    {
        Console.WriteLine(match.Groups[1].Value);
    }
    

    输出:

    jdgashg
    

    或获取多个匹配项:

    string s = "foo[%=bar%]baz[%=qux%]quux";
    foreach (Match match in Regex.Matches(s, @"\[%=(.*?)%]"))
    {
        Console.WriteLine(match.Groups[1].Value);
    }
    

    输出:

    bar
    qux
    

    注意字符串文字写为@“…”。这意味着字符串中的反斜杠被视为文字反斜杠,而不是转义代码。在用c_编写正则表达式时,这通常很有用,以避免必须将字符串中的所有反斜杠都加倍。在这里它没有多大区别,但在更复杂的例子中它会帮助更多。

        2
  •  2
  •   Greg Bacon    15 年前

    你可以用简单的

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

    但是你应该意识到它不能正确地处理嵌套。如果内容可能跨越多行,则还需要指定 RegexOption.Singleline 使 .*? 跨线边界。

        3
  •  1
  •   prodigitalson    15 年前

    %=\s?(.*?)\s?% 也许?

        4
  •  0
  •   Gumbo    15 年前

    试试这个:

    \[%=((?:[^%]|%[^\]])*)%]
    
        5
  •  0
  •   Nate C-K    15 年前
    \[%=([^%]|%[^\]])*%\]
    

    这不依赖于任何贪婪的操作符,因此应该翻译成任何正则表达式语言。你可能在乎,也可能不在乎。

        6
  •  0
  •   Tim Pietzcker    15 年前
    (?<=\[%=).*?(?=%])
    

    将匹配这两个分隔符之间的任何文本(包括换行符)(不匹配分隔符本身)。不支持嵌套分隔符。

    要遍历所有匹配项:

    Regex my_re = new Regex(@"(?<=\[%=).*?(?=%\])", RegexOptions.Singleline);
    Match matchResults = my_re.Match(subjectString);
    while (matchResults.Success) {
        // matched text: matchResults.Value
        // match start: matchResults.Index
        // match length: matchResults.Length
        matchResults = matchResults.NextMatch();
    }