Нужна помощь с сопоставлением обратных ссылок на регулярные выражения - PullRequest
1 голос
/ 21 января 2010

Я работал над этим регулярным выражением:
{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.

Наличие проблем, когда строки неправильно подбираются в правильные группы на всех перестановках с приведенным выше регулярным выражением. Я думаю, что у меня есть проблемы с группировкой скобок и / или OR (|) с утверждениями.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 21 января 2010

Как насчет захвата всех матчей в одной группе?

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]
1 голос
/ 21 января 2010

в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...