У меня есть это регулярное выражение:
<DIV(?:(?!</DIV>).)*?"(http://www\.foo\.com(?:\\.|[^"\\])*)"
И я пытаюсь использовать его с помощью c #:
@"<DIV(?:(?!</DIV>).)*?""(http://www\.foo\.com(?:\\.|[^""\\])*)"""
Но это выводит каждую вещь из <DIV
вперед, я хочу, чтобы она просто отображалась внутри ""
Подобно действительному регулярному выражению
Поскольку вы используете группы захвата (группы между парой круглых скобок ()
), вам нужно будет использовать Groups[#]
чтобы получить разные части группы захвата. Groups[1]
будут иметь значение первой группы захвата.
Если вы используете:
@"<DIV(?:(?!</DIV>).)*?""(http://www\.foo\.com(?:\\.|[^""\\])*)"""
Вы получите их между "
с помощью Groups[1].Value
и все совпадения в Groups[0].Value
.
Пример:
@"a(b(cd)(ef))"
Здесь у вас есть 3 группы захвата, потому что есть 3 пары круглых скобок. После матча, и если вы используете:
Console.WriteLine(match.Groups[0].Value); Console.WriteLine(match.Groups[1].Value); Console.WriteLine(match.Groups[2].Value); Console.WriteLine(match.Groups[3].Value);
Вы получаете:
abcdef bcdef cd ef
Если это немного запутанно, может быть, это разбиение может помочь:
a(b(cd)(ef)) 1 2 3 ^--|^--| ^---------|
Числа и ^
указывают начало групп захвата.
string str = "<DIV src=\"http://www.foo.com\"></DIV>"; Regex re = new Regex(@"<DIV(?:(?!<\/DIV>).)*?\""(http:\/\/www\.foo\.com(?:\\.|[^\""\\])*)\"""); // or Regex re = new Regex(@"<DIV(?:(?!</DIV>).)*?""(http://www\.foo\.com(?:\\.|[^""\\])*)"""); Match match = re.Match(str); Console.Write(match.Groups[1]); // Returns "http://www.foo.com"