Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Regexp.Replace / 9 сообщений из 9, страница 1 из 1
11.11.2009, 23:25
    #36305397
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
Нужно заменить ";" на "," в тех местах, где оно встречается внутри <i></i>. Делаю так:
Код: plaintext
r = Regexp.Replace(src, "<i>.+(;).+</i>", ",")
Однако заменяется весь текст, попадающий под шаблон, а не только содержимое скобок. Можно ли такую замену сделать без Regexp.Execute и анализа результатов?

Jah loves you.
...
Рейтинг: 0 / 0
12.11.2009, 01:02
    #36305503
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
AntonariyНужно заменить ";" на "," в тех местах, где оно встречается внутри <i></i>. Делаю так:
Код: plaintext
r = Regexp.Replace(src, "<i>.+(;).+</i>", ",")
Однако заменяется весь текст, попадающий под шаблон, а не только содержимое скобок. Можно ли такую замену сделать без Regexp.Execute и анализа результатов?

Jah loves you. Может, как-то так?
Код: plaintext
1.
r = Regexp.Replace(src, "(<i>.*?);(.*?</i>)", Regexp.$ 1 +","+Regexp.$ 2 )

А вообще, это на каком языке? На JS не очень похоже...
...
Рейтинг: 0 / 0
12.11.2009, 02:07
    #36305538
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
Яростный Меч,
vbscript. Можно и так: "$1,$2" (для js это тоже будет работать). Но в любом разе это поможет, если знак ";" один, даже при наличии g, даже если использовать шаблон с заглядыванием вперед. Так что скорее всего в лоб не получится. По крайней мере что-то я не могу сейчас прям сообразить как это сделать.
...
Рейтинг: 0 / 0
12.11.2009, 02:37
    #36305548
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
illionЯростный Меч,
vbscript. Можно и так: "$1,$2" (для js это тоже будет работать). Но в любом разе это поможет, если знак ";" один, даже при наличии g, даже если использовать шаблон с заглядыванием вперед. Так что скорее всего в лоб не получится. По крайней мере что-то я не могу сейчас прям сообразить как это сделать.Тогда такой вариант
Код: plaintext
1.
r = Regexp.Replace(src, "<i>(.*?;.*?)</i>", "<i>"+Regexp.$ 1 .Replace(";", ",")+"</i>")
Не знаю, правильно ли то, что на розовом фоне (с т.з. vbscript), но смысл понятен - в содержимом между <i> </i> заменяем тз на запятую. При этом берутся только те куски, которые внутри <i> </i> и содержат тз.
...
Рейтинг: 0 / 0
12.11.2009, 07:52
    #36305641
illion
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
Яростный Меч,
о, точно! Главное, я ж ведь тоже так умею, оказывается, только не вспомнилось :-) . А откуда взят синтаксис а-ля Regexp.$1? На js в моем исполнении это выглядело бы так:
Код: plaintext
1.
2.
3.
<script>
var str = "qwe;qwe <i>asd;asd;asd</i> rty;rty <i>zxc;zxc;zxc;zxc</i> uio;uio";
alert(str.replace(/(<i>)(.*?)(<\/i>)/g,function($ 0 ,$ 1 ,$ 2 ,$ 3 ){return $ 1 +$ 2 .replace(/;/g,",")+$ 3 ;}));
</script>

И только попытавшись реализовать то же самое на vbscript, я поняла, как я от него далека. 2Antonariy: Маэстро, нужен мастер-класс :-) .
Вот что у меня вышло:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
<script language="VBScript">
Function ReplaceStr(str, re, repl)
	Set regEx = New RegExp
	regEx.Pattern = re
	regEx.Global = True
	ReplaceStr = regEx.Replace(str, repl)
End Function
str1 = "qwe;qwe <i>asd;asd;asd</i> rty;rty <i>zxc;zxc;zxc;zxc</i> uio;uio"
MsgBox(ReplaceStr(str1, "(<i>)(.*?)(</i>)", "$1" & ReplaceStr("$2",";",",") & "$3"))
</script>
в итоге во втором вызове ReplaceStr в функцию передается строка $2, в ней естественно нет точек с запятой и она в неизмененном виде (как $2) передается обратно в первый ReplaceStr и там уже интерпретируется как содержимое между <i>. Какого рожна, спрашивается? Как передать $2 не как строку, а как переменную?
...
Рейтинг: 0 / 0
12.11.2009, 09:17
    #36305769
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
illionКак передать $2 не как строку, а как переменную?
В js регулярные выражения реализованы на уровне интерпретатора, а в VBS это независимый ActiveX-объект, поэтому прямой аналог function($0,$1,$2,$3) сделать не получится без нудного анализа MatchCollection. $Х можно использовать только как часть текстового параметра regEx.Replace.

Операция будет одноразовая с большим объемом данных, а делаю я это вообще в .NET, там регулярные выражения еще более навороченные в плане объектной структуры, очень неохота из-за простой с виду операции городить огороды.

Однако маловероятно, что в исходных данных встретится более одной тз в <i>, так что попробую первый вариант Меча. В крайнем случае можно его прогнать в цикле.

Jah loves you.
...
Рейтинг: 0 / 0
12.11.2009, 17:30
    #36307375
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
Antonariyа делаю я это вообще в .NETТак бы сразу и сказал
Там и заглядывания вперед, и назад есть ))
Код: plaintext
1.
2.
3.
string s = "qwe;qwe <i>asd;asd;asd</i> rty;rty <i>zxc;zxc;zxc;zxc</i> uio;uio";
Regex r = new Regex("(?<=<i>).*?;.*?(?=</i>)");
string s1 = r.Replace(s, delegate(Match m) { return m.Value.Replace(';',','); });
...
Рейтинг: 0 / 0
12.11.2009, 17:33
    #36307378
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
ps:
Код: plaintext
using System.Text.RegularExpressions;
не забываем
...
Рейтинг: 0 / 0
12.11.2009, 20:11
    #36307761
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Regexp.Replace
Учту на будущее :)
Уже все сделал с первым вариантом и циклом.

Jah loves you.
...
Рейтинг: 0 / 0
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Regexp.Replace / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]