Модераторы: Sardar, Aliance

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемы с regExp. exec() выдаёт 1 элемент 
:(
    Опции темы
Innuendo
Дата 24.8.2006, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



есть регулярное выражение:
/fo*/gi

1) надо узнать сколько в строке будет совпадений. По справочнику я посмотрел что такое сделает функция exec, которая выдаст массив с совпадениями
Код

var reg = /fo*/gi;
var s = "test fooo F fo1 foO2"
var ar1 = reg.exec(s);
alert(ar1.length);  //почему-то выводит 1 =(

Что я неверно делаю?
2) Надо обвести все куски текста подходящие регу символами "#"
Код

var reg = /fo*/gi;
var s = "test fooo F fo1 foO2"
s = s.replace(reg,"#"+reg+"#"); // только в данном случае он не обводит а заменяет на #/fo*/gi#,
                                                    // а мне надо чтоб заменял на #fooo# (для первого совпадения) и т.д.

как осуществить такое?


--------------------
=)
PM MAIL ICQ Jabber   Вверх
vasac
Дата 24.8.2006, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



1. exec ищет только одну подстроку. А в массиве хранятся общее совпадение + подшаблоны, которых у тебя нет.
Используй match

Добавлено @ 20:56 
2. Можно так:
Код

s = s.replace( reg, ( function( x ) { return '#' + x + '#' } ) );

но, по-моему, был менее извратный способ.
PM WWW   Вверх
Sardar
Дата 24.8.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



1) exec не ищет все совпадения, флаг g просто позволяет тебе искать дальше, достань в цикле все совпадения.
2) 

Код
var reg = /(fo*)/gi;
var s = "test fooo F fo1 foO2";
s = s.replace(reg,"#$1#");



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Innuendo
Дата 24.8.2006, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



а можешь объяснить эту конструкицю?
s = s.replace (reg, (function(x){return '#' + x+'#'}));
не очень понимаю как оно работает =)


--------------------
=)
PM MAIL ICQ Jabber   Вверх
Innuendo
Дата 24.8.2006, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



Цитата(Sardar @  24.8.2006,  20:59 Найти цитируемый пост)
exec не ищет все совпадения

странно, я в справочнике понял что все. тогда зачем результат выдавать в массиве? =)


--------------------
=)
PM MAIL ICQ Jabber   Вверх
Sardar
Дата 24.8.2006, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Innuendo @  24.8.2006,  20:28 Найти цитируемый пост)
огда зачем результат выдавать в массиве? 

Там подстроки захваченные скобками (), 0 это весь рег, 1 первая скобка и т.д.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Innuendo
Дата 25.8.2006, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



А вот проблема с регам...
Не получается составить рег.. намудрил так.
Нужно отлавливать телефоны, аси, и т.д.
Т.е. цифра с тире или без тире.
Но мне не надо чтоб отлавливало в строках типа:
Цитата

 вес: 32 
рост 156 

т.е. за цифрами должно идти или тире, или пробел тире, но не просто пробел, и не переход на другую строку.

Чё-то не получается составить такой рег




--------------------
=)
PM MAIL ICQ Jabber   Вверх
JSman
Дата 25.8.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 279
Регистрация: 10.7.2006

Репутация: нет
Всего: 4



(?:[0-9][ -]*)*[0-9]

номер телефона обязательно должен заканчиваться не тире и не пробелом.
если возниает ошибка - убери ?:

Цитата(Innuendo @  25.8.2006,  00:23 Найти цитируемый пост)
 и не переход на другую строку

после номера не должен быть переход на следующую строку?

((?:[0-9][ -]*)*[0-9]).+
результат в $1
PM ICQ   Вверх
Sardar
Дата 25.8.2006, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



JSman, во первых тире в классе символов нужно экранировать, во вторых лучше так:
Код
 [0-9]+(?:\s*-\s*[0-9]+)*


Лень было перечислять пробелы, потому \s, так что 
Код
Ася: 909-454 - 5345 -
54354 -344

будет найдено регом. Замени \s на [ \t] если только пробел/таб.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Innuendo
Дата 25.8.2006, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



Спасибо, но и он просто "45" без ничего отлавливает =) а мне такое не надо


--------------------
=)
PM MAIL ICQ Jabber   Вверх
Sardar
Дата 25.8.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Тогда так:  [0-9]+(?:\s*-\s*[0-9]+)+
Но учти что не все асю пишут чере тире smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Innuendo
Дата 25.8.2006, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



Я понимаю =)
Мне нужно отловить номера телефонов, аськи и т.д. Конечно можно писать и транслитом дословно, тогда это не поможет. Но так как в асе от 6 до 9 чисел, то её пишут или слитно или по 2, по 3 через тире.
Вот мне и надо, если идёт 2-3 цифры, то дальше должно идти или опять цифры или тире (с пробелами), или просто пробелы (но за пробелами опять цифры).
Вообще комбинации цифр (через тире, через пробел, через пробел-тире) исключаю просто число 2-ух и 3-ёх значное (т.е. за ним не идёт пробелов или тире и опять цифр. За ним уже или конец строки или простой текст пошел)

Я вообще с регами недавно знаком.
По справочнику их составляю. Вот как понять что вы за скобкой сразу ставите "?"- это т.е. вся скобка будет необязательная? и вообще такой знак (типа ?, +, *) действует только к первому предыдущему? и если надо ко многим, то мы их обводим в скобки?


--------------------
=)
PM MAIL ICQ Jabber   Вверх
Sardar
Дата 25.8.2006, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Проще схавать моим первым регом, затем втроой строчкой исключить что ты не хочешь. Писать единый рег,различающий:

+ 1-234
- 234
+ 2345
+ 234 -32

//где + это совпадение, - нет.

Есть гиморное занятие.

Цитата(Innuendo @  25.8.2006,  13:56 Найти цитируемый пост)
Вот как понять что вы за скобкой сразу ставите "?"- это т.е. вся скобка будет необязательная?

Да.

Цитата(Innuendo @  25.8.2006,  13:56 Найти цитируемый пост)
и вообще такой знак (типа ?, +, *) действует только к первому предыдущему?

Это квантификатор, да.

Цитата(Innuendo @  25.8.2006,  13:56 Найти цитируемый пост)
и если надо ко многим, то мы их обводим в скобки? 

Лучше не захватывающая группа (?: ), да.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Innuendo
Дата 25.8.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 24.12.2005
Где: Молдова

Репутация: 2
Всего: 6



Ок, спасибо за инструкции.
Я щас огорчен чутос:
Это я писал прогу маленькую (xul расширение), которое на определенном сайте ищет в нужных элементах (<td> с определенными классами) регулярные выражение - номера телефонов, асек, емэйлы, адреса в инете и матерные слова - и сообственно подсвечивает их (чтоб бросалось в глаза - упрощение работы модерирования).
Ну уже всё работает, только вот видно из-за перебора 40-60 этих <td> на одной странице, и куча replace'ов (c каждым регом) происходит мелкое торможение страницы. Функция весит при загрузке - загружается полностью страница, потом секунду в ступоре и всё нормально =) Вот эта секунда и нервирует =) Блин, как сделать чтоб не тормозило. Можно ли как-то сначала проверять на index.Of() и только если то реплейсить? хотя наверное если реплейс обращается к строке а там нету того, что ему надо заменить, то он сильно ресурсов не скушал +)


--------------------
=)
PM MAIL ICQ Jabber   Вверх
Sardar
Дата 25.8.2006, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Выкладывай код как ты текст парсишь/replace вызываешь. Секунду не может тормозить, ну только если страница просто огромна. Хотя в современной лисе даже на кратеньком .txt можно 230MB памяти схавать и затормозить... млин  smile 


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0819 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.