Re: Немогу понять как ето работает "Конструкции группировани
От: Пельмешко Россия blog
Дата: 26.11.09 13:37
Оценка: 13 (2)
Здравствуйте, BodukGenius, Вы писали:

BG>Привет, пожалуста помогите разобраться с этим примером.


BG>Не могу понять как работает "Сбалансированное определение группы."


(?<name1-name2> subexpression)

(Balancing group definition.) Deletes the definition of the previously defined group name2 and stores in group name1 the interval between the previously defined name2 group and the current group. If no group name2 is defined, the match backtracks. Because deleting the last definition of name2 reveals the previous definition of name2, this construct allows the stack of captures for group name2 to be used as a counter for keeping track of nested constructs such as parentheses. In this construct, name1 is optional. You can use single quotes instead of angle brackets; for example, (?'name1-name2').


То есть сбалансированная группа совпадёт только когда до этого, левее по регвыру, совпала группа с именем name2.
Если группа name2 совпала, то её capture удаляется, зато в capture name1 заносится весь интервал между name2 и name1, не включая обе группы.

Такой регвыр:
(?<br>\()\w*(?<-br>\))
Совпадёт только со словом с скобках

А если посложнее, то мона взять такой:
^\s*                # начало строки

(?:(?'br'\()\s*)*   # набор открывающих скобок
   (?<text>\w+)     # текст в скобках
(?:\s*(?'-br'\)))*  # набор закрывающих скобок

(?(br)        # проверяем, есть ли несбалансированная открытая скобка?
  (?!)        # если да, то надо упасть (это заведомо ложный negative lookahead)
  |           # иначе
  (?!\s*\))   # убеждаемся, что спереди нету ещё одной закрывающей
)
\s*$                # конец строки

Он совпадёт только со строками из слова, или из слова, заключённого в сбалансированное количество открывающих и закрывающий скобок, между которыми будет whitespace. То есть сматчатся "abc", "( abc) ", " (( abc ) )" и т.п.

Тут вся фишка в том, что группа "br" внутри ещё одной группы, которая может повторяться благодаря квантификатору * — то есть внешняя группа может сматчиться с "( ( ( (", при этом будет определено четыре capture группы "br". После того, как будет найдено само слово, начнётся обратный процесс — каждое нахождение ")" будет удалять последний найденный capture группы "br". Если открывающих скобок больше, то по окончанию capture "br" будет всё ещё определён.

С помощью сбалансированных групп в регвырах можно учитывать вложенность тегов, и т.п., но это гемморно и немного крышесносно, если честно
Немогу понять как ето работает "Конструкции группирования"
От: BodukGenius  
Дата: 26.11.09 12:32
Оценка:
Привет, пожалуста помогите разобратся с етим примером .

Не могу понять как работает "Сбалансированное определение группы."

using System;
using System.Text.RegularExpressions;

class Sample 
{
    public static void Main() 
    {
/*
    The following expression matches all balanced left and right angle brackets(<>). 
    The expression:
    1)   Matches and discards zero or more non-angle bracket characters.
    2)   Matches zero or more of:
    2a)  One or more of:
    2a1) A group named "Open" that matches a left angle bracket, followed by zero 
         or more non-angle bracket characters. 
         "Open" essentially counts the number of left angle brackets.
    2b) One or more of:
    2b1) A balancing group named "Close" that matches a right angle bracket, 
         followed by zero or more non-angle bracket characters. 
         "Close" essentially counts the number of right angle brackets.
    3)   If the "Open" group contains an unaccounted for left angle bracket, the 
        entire regular expression fails.
*/
    string pattern = "^[^<>]*" +
                     "(" + 
                       "((?'Open'<)[^<>]*)+" +
                       "((?'Close-Open'>)[^<>]*)+" +
                     ")*" +
                     "(?(Open)(?!))$";
    string input = "<abc><mno<xyz>>";
//
    Match m = Regex.Match(input, pattern);
    if (m.Success == true)
        Console.WriteLine("Input: \"{0}\" \nMatch: \"{1}\"", input, m);
    else
        Console.WriteLine("Match failed.");
    }
}

/*
This code example produces the following results:

Input: "<abc><mno<xyz>>"
Match: "<abc><mno<xyz>>"

*/


Заранее большое пасиб.
конструкции группирования регулярные выражения
Re[2]: Немогу понять как ето работает "Конструкции группиров
От: BodukGenius  
Дата: 27.11.09 03:54
Оценка:
Большое пасиб за то что открыли глаза

П>С помощью сбалансированных групп в регвырах можно учитывать вложенность тегов, и т.п., но это гемморно и немного крышесносно, если честно

Просто нуно с помощью регуляркы найти все правильно оформленые блоки некоего кода, вот и ищу. На мсдн нашол был только етот пример.

Может кто та знает хорошую литературу по регулярных выражения под дот нет, подскажите пожалуста если не сложно.
Обычные шпаргалки уже задолбали, на них далеко не уедиш в етих вопросах.
Re[3]: Немогу понять как ето работает "Конструкции группиров
От: Пельмешко Россия blog
Дата: 27.11.09 05:57
Оценка:
Здравствуйте, BodukGenius, Вы писали:

BG>Большое пасиб за то что открыли глаза


П>>С помощью сбалансированных групп в регвырах можно учитывать вложенность тегов, и т.п., но это гемморно и немного крышесносно, если честно

BG>Просто нуно с помощью регуляркы найти все правильно оформленые блоки некоего кода, вот и ищу. На мсдн нашол был только етот пример.

Опять что ли C# парсим регвырами?

BG>Может кто та знает хорошую литературу по регулярных выражения под дот нет, подскажите пожалуста если не сложно.

BG>Обычные шпаргалки уже задолбали, на них далеко не уедиш в етих вопросах.

.NET'ые регвыры несущественно отличаются от других реализаций, ну только если тормознутостью...
Не пользуйтесь регвырами для таких задач, здоровее будете. Я серъёзно.
Почему бы грамматику для Irony не описать и не парсить?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.