Помогите укртотить монстра (сократить регулярку)
Всем привет.
Есть задача, вырезать со строки определенные словосочетания, только в том случае, если рядом с ними нет букв. Сделал такой вот прегреплейс: ^((ТОВ)|(ООО)|(ДП)|(НПКП)|(ЗАО)|(ОАО)|(ЧП)|(СПД)|(ЧП)|(ФОП)|(ФЛП)|(ФЛ)|(НПП)|(МП)|(фирма)|(компания)|(частное предприятие)|(предприятие)|(ч\/п)|(OOO)|(интернет\-магазин)|(интернет)|(магазин)|(TM)|(ТМ))[^a-zа-яіґїєё]|[^a-zа-яіґїєё]((ТОВ)|(ООО)|(ДП)|(НПКП)|(ЗАО)|(ОАО)|(ЧП)|(СПД)|(ЧП)|(ФОП)|(ФЛП)|(ФЛ)|(НПП)|(МП)|(фирма)|(компания)|(частное предприятие)|(предприятие)|(ч\/п)|(OOO)|(интернет\-магазин)|(интернет)|(магазин)|(TM)|(ТМ))[^a-zа-яіґїєё]|[^a-zа-яіґїєё]((ТОВ)|(ООО)|(ДП)|(НПКП)|(ЗАО)|(ОАО)|(ЧП)|(СПД)|(ЧП)|(ФОП)|(ФЛП)|(ФЛ)|(НПП)|(МП)|(фирма)|(компания)|(частное предприятие)|(предприятие)|(ч\/п)|(OOO)|(интернет\-магазин)|(интернет)|(магазин)|(TM)|(ТМ))$ Глаз режет, аж до боли. Как это все дело можно было бы написать красивее? Ну и в случае добавления условий, его приходится добавлять сразу в трех местах, что тоже не совсем хорошо. т.е. Товарищ Иванов А.А. должен остаться без изменений, а ТОВ Иванов А.А. должен стать просто Ивановым. |
Цитата:
|
В моем случае они написаны по 3 раза. Я думал, что можно это написать как-то элегантнее
|
tazododu,
1. лучше составить массив регеспов, иначе не добавить не отнять Перебор массива - в точности тож что и палка конкатенации, но занчительно читабельнее и взаимозаменяемо |
Цитата:
т.е. простенький какой-то) |
Цитата:
или слова нужно соответствующие найти в строке,если да -так нужно искать от начала слова до конца слова,а не от начала строки до её конца, или хотябы учитывать правильную последовательность разделителей между словами |
Цитата:
ООО "Труляля" Чпонин А.А -> "Труляля" Чпонин А.А ЧП Онин А.А -> Онин А.А |
Цитата:
<p id="ThisSTROKA">.НПКП "Кузнецкий Мост" производит лучшие в мире частные предприятия ,ООО "Вася" и ч/п "Коля".</p> <script type="text/javascript"> var CensorArray=[ "ТОВ","ООО","ДП","НПКП","ЗАО","ОАО", "ЧП","СПД","ЧП","ФОП","ФЛП","ФЛ", "НПП","МП","фирма","компания", "частное предприятие","предприятие", "ч\\/п","OOO","интернет\-магазин", "интернет","магазин","TM", " ===== | CENSORED | ===== "] var arrLength = CensorArray.length-1; var str = document.getElementById('ThisSTROKA').innerHTML; var str2=str; for(var i=0; i < arrLength; i++ ){//alert("A") str2 = str2.replace(eval('/[\\s\.,]'+CensorArray[i]+'[\\s\.,]/gm'),CensorArray[arrLength]) } if(str!=str2){document.getElementById('ThisSTROKA').innerHTML=str2} </script> Экранирование в массиве нужно делать двойное "ч\\/п", |
C помощью какого метод вы хотите использовать эту регулярку: с помощью exec или другого метода?
Зачем вам так много захватывающих скобок? Вместо (ТОВ)|(ООО)|(ДП)|(НПКП)|... можно было писать ТОВ|ООО|ДП|НПКП|... Я не думаю, что вам понадобятся эти результаты совпадений. |
Я не знаю, подходит ли это вам:
/\b(?:ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM)\b/g \b обозначает границу слова. |
Нет, извините, \b обозначает границу только слов, написанных латинскими буквами, цифрами и знаком "_", поэтому мой последний вариант не подходит.
|
Есть такое решение: использовать обычную регулярку
/ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM/g, и использовать метод replace, где 2-ой параметр - функция, которая проверяет, нет ли непосредственно перед или после найденной строки буквы. |
Deff привёл неправильное решение, так как, кроме мелких ошибок, окажутся съеденными пробелы, точки или запятые перед или после ключевых слов.
|
Ещё есть такое решение:
str.replace(/(^|[^a-zа-яіґїєё])(?:ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM)(?![a-zа-яіґїєё])/g, "$1") где str - исходная строка. |
Если список ключевых слов нужно будет редактировать только вручную, то я советую использовать регулярный литерал, если список должен составляться Javascript'ом, то использовать RegExp(str)
|
Цитата:
|
Цитата:
|
oneguy,
Гы, коли мы убираем слово - Запятая верно не критична :) ? |
Ну, это зависит от поставленной задачи.
|
Цитата:
Извините за офф-топ. |
var text = '.НПКП "Кузнецкий Мост" производит лучшие в мире частные предприятия ,ООО "Вася" и ч/п "Коля". ООО "Труляля" Чпонин А.А -> "Труляля" Чпонин А.А ЧП Онин А.А -> Онин А.А т.е. Товарищ Иванов А.А. должен остаться без изменений, а ТОВ Иванов А.А. должен стать просто Ивановым. ля-ля-ля,ООО ля-ля ООО'; text = text.replace( /(^|[\s~`!@#№\$%\^&*\(\)_+\-=\[\]{};':"<>,.\/\?\\\|])(ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM|ТМ)([\s~`!@#№\$%\^&*\(\)_+\-=\[\]{};':"<>,.\/\?\\\|]|$)/ig, "$1☺$3" ); alert( text ); |
Цитата:
|
devote,
Собственно мну то показал не про саму регулярку, а удобное добавление - изъятие регеспов из оной, а Ваш вариант можно воткнуть внутрь цикла проверки Основная идея Цитата:
|
Цитата:
var text = '.НПКП "Кузнецкий Мост" производит лучшие в мире частные предприятия ,ООО "Вася" и ч/п "Коля". ООО "Труляля" Чпонин А.А -> "Труляля" Чпонин А.А ЧП Онин А.А -> Онин А.А т.е. Товарищ Иванов А.А. должен остаться без изменений, а ТОВ Иванов А.А. должен стать просто Ивановым. ля-ля-ля,О\\ОО ля-ля ООО'; var words = [ "ТОВ", "ООО", "ДП", "НПКП", "ЗАО", "ОАО", "ЧП", "СПД", "ЧП", "ФОП", "ФЛП", "ФЛ", "НПП", "МП", "фирма", "компания", "частное предприятие", "предприятие", "ч/п", "OOO", "интернет-магазин", "интернет", "магазин", "TM", "ТМ" ]; var re = new RegExp( "(^|[\\s~`!@#№\\$%\\^&*\\(\\)_+\\-=\\[\\]{};':\"<>,.\\/\\?\\\\\\|])(" + words.join("|"). replace( /\\/g, "\\\\" ) + ")([\\s~`!@#№\\$%\\^&*\\(\\)_+\\-=\\[\\]{};':\"<>,.\\/\\?\\\\\\|]|$)", "ig" ); text = text.replace( re, "$1☺$3" ); alert( text );Сиди да добавляй себе слова |
всем спасибо за дельные советы! кстати, использую я ее в php preg_replace()
|
Цитата:
|
Цитата:
|
стыдно просить, сам не могу никак написать элементарщину..
нужно проверять строку чтобы в ней были только цифры, буквы и еще пару символов почем-то такое не работает: (/^\w\s\-\/\.[a-яё]$/i).test() что не так? |
Цитата:
/^[а-яa-z\d]+$ //Внутрь [ ] вставляете еще 2 нужных символа Не? |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 11:22. |