Форум программистов, компьютерный форум, киберфорум
JavaScript: RegExp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13

Запарился с регуляркой

21.12.2010, 16:56. Показов 3047. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Короче пишу сервис для определения плотности ключей в статье под НЧ. Надо чтобы регулярка находила все вхождения определённого ключа.

если пишу
JavaScript
1
2
key='текст';
reg= new RegExp('[^А-Яа-я0-9]'+key+'[^А-Яа-я0-9]','ig');
то из
текст текст текст текст текст
находит 2-ое и 4-ое слово

если пишу
JavaScript
1
reg= new RegExp('[^А-Яа-я0-9]?'+key+'[^А-Яа-я0-9]?','ig');
находит все даже если написано так
тексттексттексттексттекст
Я так понял первый вариант впринципе правильный, только проблема в том что в начале и в конце предложения отсутствует знак в принципе, а через раз находит потому что продолжает искать сразу после совпадения, соответственно знак так же отсутствует. Не могу догнать как это выразить в регулярке. Помогите плиз.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2010, 16:56
Ответы с готовыми решениями:

Запарился с перелинковкой
Вообщем юзал я поиск, юзал... так что не кричите :) Щас попробую изложить свои мысли...%) Значит есть сайт http://www.site.ru Сайт...

Запарился с меню (
Хочу сделать, чтобы меню, при разрешении экрана < 992px было выпадающим из кнопки "тортик". Для выпадения меню задаю такую...

Запарился с адаптивностью меню
Всем доброго дня. Проблема в поведении меню на сайте. Я вроде все media стили для него настроил, но оно выезжает вместе в подменю. А...

8
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
21.12.2010, 18:22
Вариант 1, плохой:
JavaScript
1
/(?:^|[^а-яА-Я0-9])слово(?:$|[^а-яА-Я0-9])/
Тогда из
текст.текст
оно найдет только первое, потому что точка уже совпала в первом случае.

Вариант 2, разумный, но не рабочий
JavaScript
1
/\bслово\b/
\b означает "позиция граница слова". Граница между \w и \W . Вот только под \w в свою очередь не попадает [а-яА-Я]

Вариант 3, наполовину рабочий. Заглядывание вперед и назад
JavaScript
1
' bar {foo}'.match(/(?<=\{)[a-z]+(?=\})/ )
Заглядывание вперед (?=...) и (?!...) работают.
Заглядывание назад (?<=...) и (?<!...) вообще не предусмотрено и, соответственно, не работает.

Таким образом из первого и третьего можно попытаться сворганить что-то типа этого
JavaScript
1
/(?:^|[^А-Яа-яЁё0-9])слово(?![А-Яа-яЁё0-9])/
"Начало или небуква и затем слово, если за ним нет буквы".
1
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
21.12.2010, 19:06  [ТС]
Работает отлично спасибо огромное. Теперь осталось понять почему. Во первых знаки ?: и ?! вообще не знакомы, во вторых не понятно зачем использованы круглые скобки, насколько я знаю они нужны для сохранения фрагмента результата или использования в качестве метки в регулярке. Насчёт "^|выражение" сам не понимаю почему не додумался - во истину гениальное просто.
1
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
21.12.2010, 19:19
vamfirius,
(...) - карман, будет захватываться.
(?:...) - просто скобки для группировки, не будет захватываться.

(?=...) - заглядывание вперед. есть ли далее нужное выражение, но это выражение не попадает в текущее совпадение
(?!...) - аналогично негативное заглядывание вперед.
Пример

Текст
foo, bar; lol
/[a-z]+;/g - найдет только "bar;"
/[a-z]+;|; /g - надет только "bar;"

/[a-z]+(?=;)/g - найдет только "bar"
/(?:[a-z]+(?=;))|; /g - найдет "bar" и "; "
1
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
21.12.2010, 19:35  [ТС]
Vovan-VE,
Вприципе всё понятно, ещё раз спасибо. Кроме вот этого -
Я так понял.
JavaScript
1
[^А-Яа-яЁё0-9]==(?![А-Яа-яЁё0-9])
Почему тогда не работает первый вариант? Или я чего то не понимаю - тогда объясните на пальцах.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
21.12.2010, 19:49
vamfirius, Нет, это разные вещи.
Текст:
--a-b--
/[^a-z][a-z]+[^a-z]/g в первый раз найдет "-a-" , поэтому дальнейший поиск будет выполняться уже с беквы "b" , поэтому второй раз "-b-" уже не будет найдено. Аналогично, оно не найден букву в конце строки, потому что после буквы уже не будет небуквы.

А вот с /[^a-z][a-z]+(?![a-z])/g совсем иная картина. В первый раз оно найдет "-a" и дальнейший поиск продолжится не с "b--", а с "-b--" . Так что второй раз оно найдет "-b". Аналогично оно найдет букву в конце текста (потому дальше "нет буквы", как и требуется).
1
1 / 1 / 0
Регистрация: 16.06.2010
Сообщений: 13
21.12.2010, 20:37  [ТС]
Всё понял буду иметь в виду на будущее. Вы очень мне помогли, мало где на форуме можно не только найти решение да ещё и получить ответ на блюдечке, поэтому щёлкнул ещё пару раз спасибо под вашими постами.
0
35 / 35 / 6
Регистрация: 26.02.2010
Сообщений: 62
22.12.2010, 11:51
Цитата Сообщение от Vovan-VE Посмотреть сообщение
/(?:^|[^а-яА-Я0-9])слово(?:$|[^а-яА-Я0-9])/
вариант плохой можно превратить в хороший
JavaScript
1
/(?:^|[^А-яЁё0-9])слово(?=$|[^А-яЁё0-9])/
И вопрос чисто теоретический как же эту регулярку или вариант под номером 3 потом использовать?
Вопрос простой как в строке "слово слово слово" найти "слово" и скажем заменить на иное или сделать массив всех найденных совпадений используя эти регулярки?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
22.12.2010, 16:47
Цитата Сообщение от рони Посмотреть сообщение
вариант плохой можно превратить в хороший
Собственно, к этому всё и сводится.
Цитата Сообщение от рони Посмотреть сообщение
И вопрос чисто теоретический как же эту регулярку или вариант под номером 3 потом использовать?
Есть в PCRE две разные вещи:
1. (?P<name>regexp) , (?<name>regexp) - подвыражение, захватываемое с именем name. Обратная ссылка на него будет (?P=name) .
2. (?<=regexp) и (?<!regexp) - позитивное и негативное заглядывание назад.

Так вот JS отказывается понимать второе и (?< либо понимает, как первое, либо вообще не понимает. Соответственно, в примере 3 оно видит ошибку синтаксиса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.12.2010, 16:47
Помогаю со студенческими работами здесь

Нужна прога, а то я запарился
Всем привет! Я новичок, в Делфи7 могу писать тока проги hello world :( Я хочу избавиться от рутинной работы, на компе. Мну нужно через...

Запарился! Откуда null?
Привет, надеюсь что вы мне поможете... Сразу в код: index.php &lt;?php header('Content-Type: text/html; charset=utf8'); ...

Ники пользователей запарился!
У меня вопрос вот есть к примеру сайт,я на нём авторизируюсь $url = &quot;locked&quot;; $urlTo = 'locked'; $login = 'locked'; //...

одмонерный массив ..запарился делать)
нужно решить задачу по бейсику ... Дан массив A(N).определить и вывести те элементы массива которые больше своего номера.

ОУ и 1полярное питание. Немного запарился.
Изначально есть красивая симетричная синусоида. Подключаю к осцилу, выкручую громкость и вижу красивый симметричный меиндр. Наша...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru