Re: RE: 2Евгений Зайцев : прокомментируй , вроде с регекспами в xemacs разбирался.

Zajcev Evgeny <[email protected]> Fri, 17 Dec 2004 19:26:36 +0300
Newsgroups gmane.emacs.xemacs.user.russian
Message-ID <[email protected]>
"Nickolay Pakoulin" <[email protected]> writes:

> Это в Хемаксе правила группировки не определены как следует.
>
> Выдержка из документации
>
>      `\|' applies to the largest possible surrounding expressions.
>      Only a surrounding `\( ... \)' grouping can limit the grouping
>      power of `\|'.
>

Клево!  Вот значит вот именно это в XEmacs работает криво.  Кстати
откуда конкретно(какой раздел) эта выдержка?

> Если оператор альтернативы действительно действует на самое длинное
> выражение, то в случае 2 это должно быть
>
> {\([^{}|]+\)}
>
> Коля.
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Zajcev Evgeny
> Sent: Friday, December 17, 2004 2:10 PM
> To: Andrey Slusar
> Cc: [email protected]
> Subject: Re: 2Евгений Зайцев : прокомментируй , вроде с регекспами в xemacs
> разбирался.
>
> Andrey Slusar <[email protected]> writes:
>
>> From: Aleksey Cheusov <[email protected]>
>> Subject: xemacs's string-match and match-beginning
>> Newsgroups: fido.ru.emacs
>>
>>
>> Поковырялся тут немного с xemacs-ом.
>> Вижу вот такие странности.
>>
>> (if 
>>     (string-match
>>      "\\({[^{}|]+\\)}\\|\\(\\)"
>>      "{A|A}")
>>     (list 
>>      (match-beginning 1)
>>      (match-beginning 2)))
>>
>> --> (nil 0)
>>
>> (if 
>>     (string-match
>>      "{\\([^{}|]+\\)}\\|\\(\\)"
>>      "{A|A}")
>>     (list 
>>      (match-beginning 1)
>>      (match-beginning 2)))
>>
>> --> (1 0)
>>
>> GNU Emacs в обоих случаях работает правильно и дает (nil 0)
>> Это в хемахе так было задумано?
>>
>
> Вообще тут ситуация такая, это рeгекспы:
>
>   "\\({[^{}|]+\\)}\\|\\(\\)"            [1]
>
>   "{\\([^{}|]+\\)}\\|\\(\\)"            [2]
>
> не совсем правильные, и поэтому результат матчинга может быть
> имплементно зависимым.  Не совсем правильные они с той стороны что
> нельзя сказать где первая часть до |.
>
> В случае [1] это или \\({[^{}|]+\\)} (1*) или просто } (1**) -
> неопределенность.
>
> В случае [2] это или {\\([^{}|]+\\)} (2*) или может \\([^{}|]+\\)}
> (2**), или просто } (2***)- неопределенность.
>
> лучше явно определить это, например
>
>    \\(\\({[^{}|]+\\)}\\|\\(\\)\\)  - для (1*)
>    \\({[^{}|]+\\)\\(}\\|\\(\\)\\)  - для (1**)
>
>    \\({\\([^{}|]+\\)}\\|\\(\\)\\)  - для (2*)
>    {\\(\\([^{}|]+\\)}\\|\\(\\)\\)  - для (2**)
>    {\\([^{}|]+\\)\\(}\\|\\(\\)\\)  - для (2***)
>
> Надеюсь помог, спасибо.
>
> -- 
> lg
>

-- 
lg