Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите укртотить монстра (сократить регулярку) (https://javascript.ru/forum/misc/29034-pomogite-ukrtotit-monstra-sokratit-regulyarku.html)

tazododu 12.06.2012 12:53

Помогите укртотить монстра (сократить регулярку)
 
Всем привет.
Есть задача, вырезать со строки определенные словосочетания, только в том случае, если рядом с ними нет букв.
Сделал такой вот прегреплейс:

^((ТОВ)|(ООО)|(ДП)|(НПКП)|(ЗАО)|(ОАО)|(ЧП)|(СПД)|(ЧП)|(ФОП)|(ФЛП)|(ФЛ)|(НПП)|(МП)|(фирма)|(компания)|(частное предприятие)|(предприятие)|(ч\/п)|(OOO)|(интернет\-магазин)|(интернет)|(магазин)|(TM)|(ТМ))[^a-zа-яіґїєё]|[^a-zа-яіґїєё]((ТОВ)|(ООО)|(ДП)|(НПКП)|(ЗАО)|(ОАО)|(ЧП)|(СПД)|(ЧП)|(ФОП)|(ФЛП)|(ФЛ)|(НПП)|(МП)|(фирма)|(компания)|(частное предприятие)|(предприятие)|(ч\/п)|(OOO)|(интернет\-магазин)|(интернет)|(магазин)|(TM)|(ТМ))[^a-zа-яіґїєё]|[^a-zа-яіґїєё]((ТОВ)|(ООО)|(ДП)|(НПКП)|(ЗАО)|(ОАО)|(ЧП)|(СПД)|(ЧП)|(ФОП)|(ФЛП)|(ФЛ)|(НПП)|(МП)|(фирма)|(компания)|(частное предприятие)|(предприятие)|(ч\/п)|(OOO)|(интернет\-магазин)|(интернет)|(магазин)|(TM)|(ТМ))$


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

т.е. Товарищ Иванов А.А. должен остаться без изменений, а ТОВ Иванов А.А. должен стать просто Ивановым.

9xakep 12.06.2012 12:57

Цитата:

Сообщение от tazododu
определенные словосочетания

может я и ошибаюсь, но если определенные, то по-другому и не сделаешь, не?

tazododu 12.06.2012 13:01

В моем случае они написаны по 3 раза. Я думал, что можно это написать как-то элегантнее

Deff 12.06.2012 15:22

tazododu,
1. лучше составить массив регеспов, иначе не добавить не отнять
Перебор массива - в точности тож что и палка конкатенации, но занчительно читабельнее и взаимозаменяемо

tazododu 13.06.2012 09:49

Цитата:

Сообщение от Deff (Сообщение 181003)
tazododu,
1. лучше составить массив регеспов, иначе не добавить не отнять
Перебор массива - в точности тож что и палка конкатенации, но занчительно читабельнее и взаимозаменяемо

что за массив регеспов? можно пример в стиле 2+2=4 ?))
т.е. простенький какой-то)

dmitriymar 13.06.2012 10:25

Цитата:

Сообщение от tazododu
Есть задача, вырезать со строки определенные словосочетания, только в том случае, если рядом с ними нет букв.

в строке только одно слово?
или слова нужно соответствующие найти в строке,если да -так нужно искать от начала слова до конца слова,а не от начала строки до её конца, или хотябы учитывать правильную последовательность разделителей между словами

tazododu 13.06.2012 10:43

Цитата:

Сообщение от dmitriymar (Сообщение 181084)
в строке только одно слово?
или слова нужно соответствующие найти в строке,если да -так нужно искать от начала слова до конца слова,а не от начала строки до её конца, или хотябы учитывать правильную последовательность разделителей между словами

В строке может быть куча всяких слов. Например
ООО "Труляля" Чпонин А.А -> "Труляля" Чпонин А.А
ЧП Онин А.А -> Онин А.А

Deff 13.06.2012 16:45

Цитата:

Сообщение от tazododu
то за массив регеспов? можно пример в стиле 2+2=4 ?))

<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>


Экранирование в массиве нужно делать двойное "ч\\/п",

oneguy 13.06.2012 20:36

C помощью какого метод вы хотите использовать эту регулярку: с помощью exec или другого метода?
Зачем вам так много захватывающих скобок? Вместо (ТОВ)|(ООО)|(ДП)|(НПКП)|... можно было писать ТОВ|ООО|ДП|НПКП|... Я не думаю, что вам понадобятся эти результаты совпадений.

oneguy 13.06.2012 20:51

Я не знаю, подходит ли это вам:
/\b(?:ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM)\b/g

\b обозначает границу слова.

oneguy 13.06.2012 21:01

Нет, извините, \b обозначает границу только слов, написанных латинскими буквами, цифрами и знаком "_", поэтому мой последний вариант не подходит.

oneguy 13.06.2012 21:13

Есть такое решение: использовать обычную регулярку
/ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM/g
, и использовать метод replace, где 2-ой параметр - функция, которая проверяет, нет ли непосредственно перед или после найденной строки буквы.

oneguy 13.06.2012 21:18

Deff привёл неправильное решение, так как, кроме мелких ошибок, окажутся съеденными пробелы, точки или запятые перед или после ключевых слов.

oneguy 13.06.2012 21:33

Ещё есть такое решение:
str.replace(/(^|[^a-zа-яіґїєё])(?:ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM)(?![a-zа-яіґїєё])/g, "$1")

где str - исходная строка.

oneguy 13.06.2012 21:54

Если список ключевых слов нужно будет редактировать только вручную, то я советую использовать регулярный литерал, если список должен составляться Javascript'ом, то использовать RegExp(str)

Deff 14.06.2012 00:16

Цитата:

Сообщение от oneguy
Deff привёл неправильное решение,

:yes: Никто не мешает в подстановке вставлять взад пробел, (который никому не помешает) - у мну большой опыт на майл ру парсинг-цензуры в чате (не жаловались), И в моем варианте вставки замены в данном топе - не критично...

oneguy 14.06.2012 00:37

Цитата:

Сообщение от Deff (Сообщение 181275)
:yes: Никто не мешает в подстановке вставлять взад пробел, (который никому не помешает) - у мну большой опыт на майл ру парсинг-цензуры в чате (не жаловались), И в моем варианте вставки замены в данном топе - не критично...

Да нет, в вашем случае из "ля-ля-ля,ООО ля-ля" получится "ля-ля-ля ===== | CENSORED | ===== ля-ля", то есть запятая исчезнет.

Deff 14.06.2012 00:39

oneguy,
Гы, коли мы убираем слово - Запятая верно не критична :) ?

oneguy 14.06.2012 00:55

Ну, это зависит от поставленной задачи.

oneguy 14.06.2012 03:15

Цитата:

Сообщение от Deff
у мну большой опыт на майл ру парсинг-цензуры в чате (не жаловались),

Цензура чата реализована на клиенте? Если да, то можна посмотреть, а то я не знаю где чат в mail.ru?
Извините за офф-топ.

devote 14.06.2012 09:47

var text = '.НПКП "Кузнецкий Мост" производит лучшие в мире частные предприятия ,ООО "Вася" и ч/п "Коля". ООО "Труляля" Чпонин А.А -> "Труляля" Чпонин А.А ЧП Онин А.А -> Онин А.А т.е. Товарищ Иванов А.А. должен остаться без изменений, а ТОВ Иванов А.А. должен стать просто Ивановым. ля-ля-ля,ООО ля-ля ООО';

text = text.replace( /(^|[\s~`!@#№\$%\^&*\(\)_+\-=\[\]{};':"<>,.\/\?\\\|])(ТОВ|ООО|ДП|НПКП|ЗАО|ОАО|ЧП|СПД|ЧП|ФОП|ФЛП|ФЛ|НПП|МП|фирма|компания|частное предприятие|предприятие|ч\/п|OOO|интернет\-магазин|интернет|магазин|TM|ТМ)([\s~`!@#№\$%\^&*\(\)_+\-=\[\]{};':"<>,.\/\?\\\|]|$)/ig, "$1☺$3" );

alert( text );

Deff 14.06.2012 11:01

Цитата:

Сообщение от oneguy
где чат в mail.ru?

Умер

Deff 14.06.2012 11:04

devote,
Собственно мну то показал не про саму регулярку, а удобное добавление - изъятие регеспов из оной,
а Ваш вариант можно воткнуть внутрь цикла проверки
Основная идея
Цитата:

Сообщение от Deff
Перебор массива - в точности тож что и палка конкатенации,


devote 14.06.2012 14:37

Цитата:

Сообщение от Deff
Собственно мну то показал не про саму регулярку, а удобное добавление - изъятие регеспов из оной,

ну а кто мешает это делать?
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 );
Сиди да добавляй себе слова

tazododu 14.06.2012 15:24

всем спасибо за дельные советы! кстати, использую я ее в php preg_replace()

Deff 14.06.2012 15:49

Цитата:

Сообщение от tazododu
использую я ее в php preg_replace()

Хм - для PHP есть иная тема , а не Общие вопросы Javascript

tazododu 15.06.2012 10:03

Цитата:

Сообщение от Deff (Сообщение 181411)
Хм - для PHP есть иная тема , а не Общие вопросы Javascript

По регуляркам не нашел раздела. А то, где я ее использую разве играет такое большое значение :-?

tazododu 08.08.2012 18:25

стыдно просить, сам не могу никак написать элементарщину..
нужно проверять строку чтобы в ней были только цифры, буквы и еще пару символов
почем-то такое не работает:
(/^\w\s\-\/\.[a-яё]$/i).test()

что не так?

Hekumok 08.08.2012 18:36

Цитата:

Сообщение от tazododu (Сообщение 195695)
нужно проверять строку чтобы в ней были только цифры, буквы и еще пару символов

/^[а-яa-z\d]+$ //Внутрь [ ] вставляете еще 2 нужных символа

Не?

tazododu 08.08.2012 18:59

Цитата:

Сообщение от Hekumok (Сообщение 195700)
/^[а-яa-z\d]+$ //Внутрь [ ] вставляете еще 2 нужных символа

Не?

спасибо! :dance:

Hekumok 08.08.2012 19:01

Цитата:

Сообщение от tazododu (Сообщение 195711)
спасибо! :dance:

Да не за шт)))


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