Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   ПРОБЛМА С RegEXP (https://javascript.ru/forum/misc/24627-problma-s-regexp.html)

Livaanderiamarum 08.01.2012 03:38

ПРОБЛМА С RegEXP
 
КАК найти что-то ПЕРЕД чем стоит определенный символ, но НЕ захватить этот символ?

Livaanderiamarum 08.01.2012 04:30

Ну, кроме как взять все, кроме этого символа, в скобочки

на самом деле я соврал что изучал регулярки) вчера ночью начал учить по ссылкам что дали.
пишу вот для теста регулярку ищущую ссылки на youtube на форуме и заменяющую эти ссылки роликами.

var reg = /(?:\s|^)(?:http:\/\/www\.|https:\/\/www\.|www\.)?youtube.com\/watch\?\S*v=(\S*?)(?:\s|&\S*|$)/


она захватывает первый пробел если он там есть, и захватывает последний пробел если после айдишника видео v=apdwyVW0HnE не идет знака &

как избавится от этого?

nerv_ 08.01.2012 15:46

Цитата:

Сообщение от Livaanderiamarum
КАК найти что-то ПЕРЕД чем стоит определенный символ, но НЕ захватить этот символ?

Хороший вопрос) Я уже задавал себе аналогичный. Думаю, не как :) Может кто из профи ответит иначе...

monolithed 08.01.2012 16:00

Цитата:

Сообщение от nerv_
Думаю, не как

alert('foo|bar'.match(/\|(\w+)/)[1]);

Livaanderiamarum 08.01.2012 16:09

Цитата:

Сообщение от monolithed (Сообщение 148872)
alert('foo|bar'.match(/\|(\w+)/)[1]);

ну и попробуй теперь замени bar не затронув палочку перед ним?
-----
я это сделать тоже могу, хочу посмотреть способ без извращений.
например

/ (?:\s | -) (?: коты)/ например как мне заменить ТОЛЬКО слово коты не затронув пробел перед ним?
потому что может быть либо пробел либо тире! которые не должны трогаться. неужели придется сохранять еще одну группу?

/ (\s | -) (?: коты)/ заменяем "$1страусы" типа того? А это не сильно нагружает комп?

monolithed 08.01.2012 16:48

Цитата:

Сообщение от Livaanderiamarum
ну и попробуй теперь замени bar не затронув палочку перед ним?

смотря в каком контексте, например так:
alert('foo|bar'.replace(/\w+(?=$)/g, 'foo'));

ну и так далее, главное чтобы было от чего оттолкнуться

Livaanderiamarum 08.01.2012 17:07

так, я что-то не уловил при чем входные данные)) ты оттолкнулся от того что СТРОКА КОНЧАЕТСЯ)?
ну давай сделаем боевые условия

" |bar &bar "

var str = '   |bar     &bar  '
alert( str.replace(  /(\|)(bar)\s/g,     '$1foo')         );

Livaanderiamarum 08.01.2012 17:16

Иными словами НЕ ЗАТРОНУТЬ ЭТОТ ПЕРЕДНИЙ СИМВОЛ никак, мы можем его только ПЕРЕЗАПИСАТЬ ТАКИМ-ЖЕ)))

monolithed 08.01.2012 17:18

alert('папра 5 foo|bar 54 тиапт апк4'.replace(/\w+(?=\s\d)/, 'foo'));

Livaanderiamarum 08.01.2012 17:19

Цитата:

Сообщение от monolithed (Сообщение 148884)
alert('папра 5 foo|bar 54 тиапт апк4'.replace(/\w+(?=\s\d)/, 'foo'));

ну тут видешь саму суть регулярок не используешь, тебе зарание известна строка в которой будем искать, а этого быть не должно.

nerv_ 08.01.2012 17:22

Цитата:

Сообщение от monolithed
главное чтобы было от чего оттолкнуться

Хороший пример, спасибо :) Кажется, улавливаю логику: чтобы найти что-то перед чем стоит определенный символ, надо искать не этот символ, а то, что следует за ним.
Позволил себе немного изменить Ваш пример
var x = "foo|bar";
var z = /(?=\w+$)/;

var w = x.replace(z, "="); // находит позицию после "|" и вставляет туда символ

alert(w);

Livaanderiamarum 08.01.2012 17:35

чтобы найти что-то перед чем стоит определенный символ, надо искать не этот символ, а то, что следует за ним.
_______
а я не улавливаю логики..........
попробуй сделай это с поиском ссылок вида

www.youtube.com чтобы ссылка отделялась от остального текста пробелами при том заменялась ссылкой www.google.com при том пробелы слева и справа ссылки оставались бы нетронутыми

вот в этой строке

"www.youtube.com блаwww.youtube.com бла www.youtube.com"

Livaanderiamarum 08.01.2012 17:36

п.с. парсер сайта ссылки уже зпарсил смотрю) лол не обращай на это внмания

monolithed 08.01.2012 17:40

Цитата:

Сообщение от Livaanderiamarum
ну тут видешь саму суть регулярок не используешь, тебе зарание известна строка в которой будем искать, а этого быть не должно.

var text = 'папра 5 foo|bar 54 тиапт апк4';
alert(text.replace(RegExp(text.match(/\|(\w+\b)/)[1]), 'foo'));

Livaanderiamarum 08.01.2012 17:43

аа!!!!! все прозрел)))!!!!!

[1] обращение к свойству регулярки возвращает уже не саму регулярку а скобочную группу)))) спасибо))!
я забл что мы точку используем и к свойству обращаемся)))

nerv_ 08.01.2012 18:28

Livaanderiamarum, как понял
// Задача заменить youtube.com в середине строки так, чтобы пробелы слева и справа оставались не тронутыми
var x = "youtube.com бла youtube.com бла youtube.com";
var z = /(?!^)youtube.com(?= )/g;
var w = x.replace(z, "google.com");
alert(w);

var x = "папра 5 foo|bar 54 тиапт апк4";
var z = /(?! )[a-z]+(?= )/g
var w = x.replace(z, "foo");
alert(w);

Livaanderiamarum 08.01.2012 18:58

Цитата:

Сообщение от nerv_ (Сообщение 148907)
Livaanderiamarum, как понял
// Задача заменить youtube.com в середине строки так, чтобы пробелы слева и справа оставались не тронутыми
var x = "youtube.com бла youtube.com бла youtube.com";
var z = /(?!^)youtube.com(?= )/g;
var w = x.replace(z, "google.com");
alert(w);

Не, задача заменить ВСЕ ютьюбы)) я специально сделал их в разных местах в разных условиях)

nerv_ 08.01.2012 19:05

Цитата:

Сообщение от Livaanderiamarum
Не, задача заменить ВСЕ ютьюбы

Тогда еще проще
// Задача заменить все youtube.com так, чтобы пробелы слева и/или справа оставались не тронутыми
var x = "youtube.com бла youtube.com бла youtube.com";
var z = /youtube.com/g;
var w = x.replace(z, "google.com");
alert(w);

Livaanderiamarum 08.01.2012 19:23

блин тогда так)
1) заменить все ССЫЛКИ на ютьюб, словом "НННЯЯЯ"
2) при том чтобы пробелы слева и справа от них остались нетронутыми
3) при том что длинны ссылок могут быть разные
4) при том что слова и знаки не могут касаться наших ссылок ни справа ни слева. только пробелы могут их касаться, иначе ссылка не считается ссылкой.

вот строка


"youtube.com/wacht?fdfg^%fgdghd745u76GHkGKGHK&8^56756*?fgd=fgdg бла youtube.com/fgdgdf?:fdgfd+пав=*?а бла youtube.com.апвпав*?=fg";


Часовой пояс GMT +3, время: 15:48.