需要有关正则表达式的后引用匹配的帮助

时间:2010-01-21 05:41:57

标签: .net regex

我一直在研究这个正则表达式:
{link=([^|{}]+)\||([^|{}]+)\||([^|{}]+)}

我希望捕获任何非管道或括号字符,并将它们放在适当的反向引用(组)中。

如何退回以下内容:

  1. 如果测试字符串为{link=a},则将a返回到第3组。
  2. 如果测试字符串{link=a|b}a返回到第2组,b返回到第3组。
  3. 如果测试字符串{link=a|b|c}a返回到第1组,b返回到第2组,c返回到第3组。
  4. 在使用上述正则表达式的所有排列中,没有正确地将字符串拾取到正确的组中的问题。我认为我有括号分组问题和/或OR|)语句问题。

    提前致谢。

2 个答案:

答案 0 :(得分:1)

在python中,但语法应该相同,

#!/usr/bin/python

import re
ptn = re.compile(r"""
    {link=
    (?:
      (?:([^|}]+)\|)?
      (?:([^|}]+)\|)
    )?
    ([^|}]+)
    }
    """, re.VERBOSE)

l = [
    "{link=a}",
    "{link=a|b}",
    "{link=a|b|c}",
    "{link=a} {link=a|b} {link=a|b|c}",
]
for s in l:
    for m in ptn.finditer(s):
        print "%s => matchs: %s => m.group(3): %s" % (
                s, m.group(0), m.group(3))

和结果:

{link=a} => matchs: {link=a} => m.group(3): a
{link=a|b} => matchs: {link=a|b} => m.group(3): b
{link=a|b|c} => matchs: {link=a|b|c} => m.group(3): c
{link=a} {link=a|b} {link=a|b|c} => matchs: {link=a} => m.group(3): a
{link=a} {link=a|b} {link=a|b|c} => matchs: {link=a|b} => m.group(3): b
{link=a} {link=a|b} {link=a|b|c} => matchs: {link=a|b|c} => m.group(3): c

答案 1 :(得分:1)

如何捕获同一组中的所有匹配项?

string[] tests = {
    "{link=a}",
    "{link=a|b}",
    "{link=a|b|c}",
};

var link = @"(?<link>[^|]+)";
var pattern = new Regex(String.Format(@"^\{{link={0}(\|{0})*\}}$", link));

foreach (var s in tests) {
    Match m = pattern.Match(s);

    if (!m.Success) {
        Console.WriteLine("{0}: FAIL", s);
        continue;
    }

    Console.Write("{0}: PASS ", s);
    foreach (var l in m.Groups["link"].Captures)
        Console.Write("[{0}]", l);
    Console.WriteLine();
}

输出:

{link=a}: PASS [a]
{link=a|b}: PASS [a][b]
{link=a|b|c}: PASS [a][b][c]