Модераторы: 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   Вверх
Innuendo
Дата 25.8.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код в студию:
Да, не удивляйтесь, там регулярные выражения - маски матерных слов =) 
Так как для написания в Мозилле нельзя в исходнике использовать кириллицу, я писал в Уникоде, и переводил в кирриллицу (это уже работает, так как она хранится в переменной, а не ведена мной вручную в исходнике)
Код

//массив выражений с матами и т.д
var badwordsTR = new Array(/(^|\s|za|po|na)(e|i)ba?/gi, /(x|h)u(y|j|i|e)/gi,
                            /p(e|i)zd/gi, /su(k|4|ch)/gi, /(^|\s)blea/gi);
var badwordsRU = new Array(
       /(^|\s|&#1079 ;&#1072 ;|&#1085 ;&#1072 ;|&#1087 ;&#1086 ;)(&#1080 ;|&#1077 ;|&#1103 ;|&#1105 ;)&#1073 ;&#1072 ;?/gi,
                        /&#1093 ;&#1091 ;(&#1080 ;|&#1081 ;|&#1077 ;|&#1103 ;|&#1105 ;)/gi, /&#1073 ;&#1083 ;&#1103 ;/gi, 
                        /&#1089 ;&#1091 ;(&#1095 ;|&#1082 ;|4)/gi, /&#1087 ;(&#1080 ;|&#1077 ;)&#1079 ;&#1076 ;/gi);
var spamwordsTR =  new Array(/\@/gi, /(http|ftp)(s)?:\/\//gi, /www/, /email/gi, /icq/gi);
var spamwordRU = /(&#1077 ;|&#1080 ;)\s*(-)?\s*&#1084 ;(&#1101 ;|&#1077 ;)(&#1081 ;|&#1080 ;)&#1083 ;/gi;
var numbers = /[0-9]{3}\S(\s*-?[0-9]*)+/gi;
//cтили
var lightStyles = new Array();;
lightStyles['bad'] = "background-color:red; color:yellow; padding:1px;";
lightStyles['spam'] = "background-color:blue; color:red; padding:1px;";
lightStyles['numbers'] = "background-color:green; color:orange; padding:1px;";

// =сумма массивов=//
function arraysumm(ar1,ar2){
var l1 = ar1.length;
var l2 = ar2.length;
for (var i=0; i<l2; i++){
 ar1[l1+i] = ar2[i];
}
return ar1;
}

//найти ТДшки с классом
function getElementsByClassName2(classname)
{
//их се загоняем в массив
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = window._content.document.getElementsByTagName("td");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

//находим и подсвечиваем
function findTrash(){
//Данные анкеты
var tdo = getElementsByClassName2("co");
var tdn = getElementsByClassName2("cn");
var tds = arraysumm(tdo,tdn);
var j,i;
for (j=0; j<tds.length; j++){
//Маты на транслите
for (i=0; i<badwordsTR.length; i++){
tds[j].innerHTML=tds[j].innerHTML.replace(badwordsTR[i],(function(x) {return '<span style="'+lightStyles["bad"]+'">' + x + '</span>'}))
}
//маты на русском
for (i=0; i<badwordsRU.length; i++){
var badword = new XML ("<text>" + badwordsRU[i] + "</text>");
                                      badword = badword.toString();                                  
tds[j].innerHTML=tds[j].innerHTML.replace(eval(badword),(function(x) {return '<span style="'+lightStyles["bad"]+'">'+ x + '</span>'}));
}
//мыла и адреса на транслите
for (i=0; i<spamwordsTR.length; i++){
tds[j].innerHTML=tds[j].innerHTML.replace(spamwordsTR[i],(function(x) {return '<span style="'+lightStyles["spam"]+'">'+x+'</span>'}));
}
// мыло на русском
var spamword = new XML("<text>"+spamwordRU+"</text>");
                            spamword = spamword.toString();
tds[j].innerHTML=tds[j].innerHTML.replace(eval(spamword),(function(x) {return '<span style="'+lightStyles["spam"]+'">'+x+'</span>'}));

tds[j].innerHTML=tds[j].innerHTML.replace(numbers,(function(x){return'<span style="'+lightStyles["numbers"]+'">'+x+'</span>'}));
}

}

В уникоде перед двоеточием я специально поставил пробелы, чтоб они тут не преобразовались в символы =)

Это сообщение отредактировал(а) Innuendo - 25.8.2006, 19:24


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


Опытный
**


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

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



так мне и не помогут?  =)


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


 




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


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

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