dil: (Default)
dil ([personal profile] dil) wrote2006-11-30 03:05 pm

Почему, ну почему майкрософтовские программисты такие ненатуралы?

Дано: ASP/JScript.
Задача: выделить из строки первые три слова.

Пишем регулряное выражение:
var re = new RegExp("^(\\s*(\\S+\\s+){3})" , "")
str = str.replace(re, "$1")

Индейская национальная изба.

Целый час бился, и так, и эдак - ну не матчится, хоть тресни.
В конце концов оказалось, что по-майкрософтовски это надо писать так:
"^(\\s*(\\S+\\s+){3}).*"
или так:
"^(\\s*(\\S+\\s+){3}).*$"

С последними тремя словами все еще хуже. Это только так:
".*((\\s+\\S+){3}\\s*)$"

А вот так уже не:
"((\\s+\\S+){3}\\s*)$"
И что самое смешное, вот так тоже не:
"^.*((\\s+\\S+){3}\\s*)$"

Ну и как их после этого не назвать пиненатуралами?

[identity profile] lazyboa.livejournal.com 2006-11-30 06:37 pm (UTC)(link)
Возможно, дело в (positive|negative) (lookahead|lookbehind).

[identity profile] dil.livejournal.com 2006-11-30 08:09 pm (UTC)(link)
Не понял. какой lookahead|behind? Как выражение с привязкой к началу строки может перестать матчиться от того, что у него в конце убрали .* ?

[identity profile] lazyboa.livejournal.com 2006-12-01 06:21 am (UTC)(link)
Есть там всякие (?=), (?<=)
Как-то так (http://msdn2.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic13).

[identity profile] quappa.livejournal.com 2006-12-01 12:06 am (UTC)(link)
Это Вы просто устали. Ну или подзабыли, что делает replace в этом языке.

Первый регекс работал. Заменял первые три слова на первые три слова, оставшуюся часть не трогал. Соответственно, изменений в строке не было.

Последние два регекса заменяют первые три слова ПЛЮС ВЕСЬ ОСТАТОК СТРОКИ на первые три слова. Что и требовалось (видимо).

Такие дела.

[identity profile] max-gashkov.livejournal.com 2006-12-01 08:23 am (UTC)(link)
+1, зачем для выделения пользоваться заменой?