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

Zajcev Evgeny <[email protected]> Fri, 17 Dec 2004 14:09:55 +0300
Newsgroups gmane.emacs.xemacs.user.russian
Organization Home
Message-ID <[email protected]>
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