Discussion:
s///
(слишком старое сообщение для ответа)
Alexey Vissarionov
2011-02-15 19:55:44 UTC
Permalink
Доброго времени суток, All!

Коллеги, просветите: как средствами эхотага осуществить поиск и замену по
регулярному выражению?

То есть, нужен эхотажный аналог перлового

sub convert()
{
my $str = shift;
$str =~ s/(a|b)c[0-9]{2}/xyz$2/ig;
return $str;
}

http://www.tizag.com/javascriptT/javascript-string-replace.php и аналогичные
описания читал - так и не нашел, как использовать в строке замены элемент
исходной строки.

З.Ы. (Замечу Ышо): пропустить строку через внешний обработчик - тоже вполне
годное решение.


--
Alexey V. Vissarionov aka Gremlin from Kremlin
gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii

... Лучший способ прекратить безобразие - возглавить оное
Semen Panevin
2011-02-15 20:48:26 UTC
Permalink
Доброго здоровьица тебе, Alexey!

15 фев 11 22:55, Alexey Vissarionov писал All:

AV> То есть, нужен эхотажный аналог перлового

AV> sub convert()
AV> {
AV> my $str = shift;
AV> $str =~ s/(a|b)c[0-9]{2}/xyz$2/ig;
AV> return $str;
AV> }

Может вот это поможет?

Backreferences
Backreferences are references to the same thing as a previously captured
match. n is a positive nonzero integer telling the browser which captured match
to reference to.

/(\S)\1(\1)+/g matches all occurrences of three equal non-whitespace characters
following each other.
/<(\S+).*>(.*)<\/\1>/ matches any tag.

E.g: /<(\S+).*>(.*)<\/\1>/ matches '<div id="me">text</div>' in "text<div
E.g: /<(\S+).*>id=\"me\">text</div>text".

Взято отсюда: http://www.evolt.org/node/36435

Потом ещё кучку ссылок по теме нарыл.
http://www.webreference.com/js/column5/values.html
http://www.regular-expressions.info/brackets.html

Ну и ещё много чего гугль находит если в строке поиска ввести "javascript regex
replace with back references"

С наилучшими пожеланиями, Семён.

... Незаменимых людей нет, но исключением стать хочется... (c)...
Alexey Vissarionov
2011-02-16 19:35:26 UTC
Permalink
Доброго времени суток, Semen!

15 Feb 2011 23:48:26, ты -> мне:

AV>> sub convert()
AV>> {
AV>> my $str = shift;
AV>> $str =~ s/(a|b)c[0-9]{2}/xyz$2/ig;
AV>> return $str;
AV>> }
SP> Может вот это поможет?
SP> Backreferences

Да знаю я, как оно называется... Мне синтаксис был непонятен.

SP> Взято отсюда: http://www.evolt.org/node/36435
SP> Потом ещё кучку ссылок по теме нарыл.
SP> http://www.webreference.com/js/column5/values.html
SP> http://www.regular-expressions.info/brackets.html
SP> Ну и ещё много чего гугль находит если в строке поиска ввести
SP> "javascript regex replace with back references"

Угу, примерно так и искал.


--
Alexey V. Vissarionov aka Gremlin from Kremlin
gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii

... И голосом звучным туда всех послал, откуда мы все появились
Mithgol the Webmaster
2011-02-16 05:50:34 UTC
Permalink
Так было 22:55 15 Feb 11 написано от Alexey Vissarionov к All:

AV> Коллеги, просветите: как средствами эхотага осуществить поиск и замену
AV> по регулярному выражению?

AV> То есть, нужен эхотажный аналог перлового

AV> sub convert()
AV> {
AV> my $str = shift;
AV> $str =~ s/(a|b)c[0-9]{2}/xyz$2/ig;
AV> return $str;
AV> }

AV> http://www.tizag.com/javascriptT/javascript-string-replace.php и
AV> аналогичные описания читал - так и не нашел, как использовать в строке
AV> замены элемент исходной строки.

AV> З.Ы. (Замечу Ышо): пропустить строку через внешний обработчик - тоже
AV> вполне годное решение.

function convert () {
return arguments.shift().replace(/(a|b)c[0-9]{2}/ig, 'xyz$2');
}

См. также пункт 15.5.4.11 стандарта ECMA-262 третьей редакции (декабрь 1999).

Другое дело, что $2 не имеет здесь никакого смысла: у тебя в регулярке только
одна пара скобок, поэтому $1 принимает значения 'a' или 'b', а в $2 всегда
пустая строка. Чего хотел-то?


Фидонет будет великим и гипертекстовым! [Ru.Mozilla] http://Mithgol.Ru/
Mithgol the Webmaster. [Братство Нод] [Team А я меняю subj]

... они не делают, что перпендикулярно к их жизни. (Григорий Явлинский)
Alexey Vissarionov
2011-02-16 19:22:24 UTC
Permalink
Доброго времени суток, Mithgol!

16 Feb 2011 08:50:34, ты -> мне:

AV>> Коллеги, просветите: как средствами эхотага осуществить поиск и замену
AV>> по регулярному выражению?
AV>> То есть, нужен эхотажный аналог перлового
AV>> sub convert()
AV>> {
AV>> my $str = shift;
AV>> $str =~ s/(a|b)c[0-9]{2}/xyz$2/ig;
AV>> return $str;
AV>> }
MW> function convert () {

Гы... египетские скобки. Я думал, они только в книжке K&R остались :-)

MW> return arguments.shift().replace(/(a|b)c[0-9]{2}/ig, 'xyz$2');
MW> }
MW> Другое дело, что $2 не имеет здесь никакого смысла: у тебя в
MW> регулярке только одна пара скобок, поэтому $1 принимает значения 'a'
MW> или 'b', а в $2 всегда пустая строка. Чего хотел-то?

В примере - заменить ac или bc, после которых написаны как минимум две цифры,
на xyz с теми же цифрами.

В реальной задаче - заменять в HTML-страницах некого до безобразия кривого, но
(увы!) столь же полезного сайта URLы вида javascript:openpdf('/lib_a/123.pdf')
на http://example.net/library/a123.pdf средствами GreaseMonkey. Сразу уточню:
включить интерпретатор эхотага для этого сайта нельзя - доверия ему ноль целых
хрен сотых.


--
Alexey V. Vissarionov aka Gremlin from Kremlin
gremlin ПРИ gremlin ТЧК ru; +vii-cmiii-ccxxix-lxxix-xlii

... Хайло (сущ.): инструмент для руководства горными и земляными работами
Mithgol the Webmaster
2011-02-16 20:38:24 UTC
Permalink
Так было 22:22 16 Feb 11 написано от Alexey Vissarionov к Mithgol the Webmaster:

MtW>> function convert () {

AV> Гы... египетские скобки. Я думал, они только в книжке K&R остались :-)

Позволяют экономить вертикальное пространство.

MtW>> return arguments.shift().replace(/(a|b)c[0-9]{2}/ig, 'xyz$2');
MtW>> }
MtW>> Другое дело, что $2 не имеет здесь никакого смысла: у тебя
MtW>> в регулярке только одна пара скобок, поэтому $1 принимает значения
MtW>> 'a' или 'b', а в $2 всегда пустая строка. Чего хотел-то?

AV> В примере - заменить ac или bc, после которых написаны как минимум две
AV> цифры, на xyz с теми же цифрами.

Тогда return arguments.shift().replace(/(a|b)c([0-9]{2})/ig, 'xyz$2');
причём и в перле тебе бы также понадобилась вторая пара скобок, потому что
язык регэкспов всюду один и тот же. (Разве что lookbehind assertions в перле
есть, а в джаваскрипте нету. Однако это редкостная штука, так что и пёс с ней.)


Фидонет будет великим и гипертекстовым! [Ru.Mozilla] http://Mithgol.Ru/
Mithgol the Webmaster. [Братство Нод] [Team А я меняю subj]

... Помогайте талибам: пользуйтесь арабскими цифрами!
Loading...