Страницы: 1
RSS
Замена отдельных слов с регулярными выражениями, "{\b(ИП|ООО|ЗАО|Торговая Компания)\b}"
 
Подскажите, как правильно написать паттерн в регулярных выражениях,  чтобы заменить отдельностоящие слова или выражния.
Например:
Заменить на "пробел" если попадается что-н из этого: ИП, ООО, ЗАО, Торговая Компания.
Я думала что это должно выглядеть примерно так:
"{\b(ИП|ООО|ЗАО|Торговая Компания)\b}"
Поправьте как правильно?  
Работать надо не 12 часов, а головой.
 
Доброе время суток.
Цитата
Прочитала статью Николая Павлова про регулярные выражения
Это всё же обзорная статья, а не руководство. Регулярным выражениям целые книги посвящены. В VBScript.RegExp \b действуют только по границе слова, написанного латиницей. Прямого эквивалента нет. Так что примерный эквивалент
Цитата
Leanna написал:
\b(ИП|ООО|ЗАО|Торговая Компания)\b
Код
Public Function delAbbr(ByVal thisText As String) As String
    Dim pReg As Object
    Set pReg = CreateObject("VBScript.RegExp")
    pReg.Global = True: pReg.Pattern = "([\.,;:\s]|^)(?:ИП|ОАО|ЗАО|АО|ООО|фирма|ЧП|ТД)(?=[\.,;:\s]|$)"
    delAbbr = pReg.Replace(thisText, "$1")
End Function

И всё же, исходя из вашего девиза, не могли бы вы на будущее готовить более человеческий пример, что есть, как хочется? Чтобы
Цитата
Leanna написал:
Работать надо ... головой
Успехов.
Изменено: Андрей VG - 11.05.2018 18:44:54
 

Спасибо большое за пояснения про \b и за пример.

([\.,;:\s]|^) - это вроде понятно: определяет какой-либо из символов - точку/запятую/точку с запятой/двоеточие/побел и подобное ИЛИ начало строки
(?:ИП|ОАО|ЗАО|АО|ООО|фирма|ЧП|ТД|_) - не могу расшифровать "?:"и "_". Что они означают?
(?=[\.,;:\s]|$) - не могу расшифровать в выражении "?=" (знаю только, что ? - это ноль или одно вхождение, а для чего "=" не знаю)

От "[^А-Яа-яёЁ0-9A-Za-z\-]", думаю не стоит отказываться, потому что кроме [\.,;:\s]|^) могут встречаться и кавычки всех сортов и нижние подчеркивания и всё подряд.
После Replace "[^А-Яа-яёЁ0-9A-Za-z\-]" на "пробел", как я понимаю, должно идти вот такое: "(\s|^)(?:ИП|ОАО|ЗАО|АО|ООО|фирма|ЧП|ТД|_)(\s|$)"
Верно?
По прежнему не понимаю для чего "?:" и "_"

Я ещё пыталась сделать такое: если первая отдельностоящая группа это цифры (без вкрапления букв) и есть второе слово за пробелом, то соединить их нижним подчеркиванием.
Например "ООО 7 континент мира" -> "7_континент", или "ЗАО 29 спуск" -> "29_спуск", но! "7Б Куликово ЧП" - это "7Б", но! "777 фирма" -> "777"
Вы могли бы помочь? Как проверить, что первая группа до пробела это только числа?

Я представляла бы себе паттерн для задачки с цифрами таким:
"(^+\d{1,}\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)" - но в примере не работает.

Вот этот блок у меня вылетает:
Код
If regex.Test(txt) Then
    Set matches = regex.Execute(txt)
    txt = matches.Item(0)
    txt = Replace(txt, " ", "_")
Else
    regex.Pattern = "(^+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)"
    If regex.Test(txt) Then
        Set matches = regex.Execute(txt)
        txt = matches.Item(0)
    Else
        txt = "-"
    End If
End If


Смысл кода выше - если первое слово - все_знаки_цифры - то обрабатывем, как я описала выше. Если это буквы, то берем _только_ первое слово. Если букв-цифр не имеется - т.е. пусто или пробелы, то ставим "-".

С файлом-примером исправилась. Этот более человечный. Просто я не думала что первый файл-пример не пригодится, т.к. сократила свой изначальный вопрос и думала, что на него можно ответить без моего примера.

Изменено: Leanna - 14.05.2018 19:30:14
Работать надо не 12 часов, а головой.
 
Описание регулярных выражений от Microsoft - здесь. Авторы, правда, дают на изучение 2 мин :D  
Владимир
 
На русском
https://docs.microsoft.com/ru-ru/previous-versions/visualstudio/visual-studio-2008/28hw3sce%28v%3dvs...
 
Цитата
Kuzmich написал:
На русском
как по мне, так самый толковый справочник по RexExp.Pattern.
Цитата
Leanna написал:
Я ещё пыталась сделать такое:
Всё же это не относится, на мой взгляд, к названию темы. Так что стоит для этого создать отдельную тему.
 
Все-таки не поняла, что такое из #2 делают? ?= ?: _

(?:ИП|ОАО|ЗАО|АО|ООО|фирма|ЧП|ТД|_)
(?=[\.,;:\s]|$)

Отдельно вопрос про другую часть регулярных выражений, хорошо, вынесу.
Изменено: Leanna - 14.05.2018 23:40:17
Работать надо не 12 часов, а головой.
 
Цитата
Leanna написал:
что такое из #2 делают? ?= ?:

В каждой из ссылок #4-#6 есть объяснение этих конструкций.
Владимир
 
Цитата
sokol92 написал:
есть объяснение этих конструкций.
Привет, Владимир.
Присоединюсь. Leanna, вы несколько не правильно ставите вопрос, потому и не находите информацию в тексте по ссылкам ;)  
Читайте про:
(шаблон)
(?:шаблон)
(?=шаблон)
(?!шаблон)
Модификаторы ?: ?= ?! работают только внутри и начале ()
 
Цитата
(?:pattern) Часть выражения, соответствующая слову pattern, но не сохраняющая данной совпадение для использования в дальнейшем. Это удобно использовать для объединения частей шаблона со знаком "или" (|). Например, выражение "industr(?:y|ies)" является более экономичным, чем выражение "industry|industries".

(?=pattern) Часть выражения, выполняющая поиск с положительным просмотром вперед, который соответствует искомой строке в любой точке, где начинается строка, совпадающая с шаблоном pattern. Это сравнение выполняется без сохранения совпадения для возможного использования в дальнейшем. Например, шаблон "Windows (?=95|98|NT|2000)" соответствует слову "Windows" в последовательности "Windows 2000", но не слову "Windows" в последовательности "Windows 3.1". При поиске вперед знаки не обрабатываются, то есть после нахождения совпадения сразу же начинается поиск следующего совпадения, если только оно не включает знаки, входящие в положительный просмотр вперед.

Вы просто знаете для чего это, поэтому, может, вам эти объяснения понятны.
Я не понимаю этого описания.
(?:ИП|ОАО|ЗАО|АО|ООО|фирма|ЧП|ТД|_)  - всегда когда используешь ИЛИ надо ставить ?:
(?=[\.,;:\s]|$) - тут из описания выше вообще не понимаю какую функцию выпаолняет.

Можно ли человеческим языком объяснить на данном примере работу ?: и ?=
Про нижнее подчеркивание ничего не нашла. Для чего оно перед скобкой в конце.
Изменено: Leanna - 16.05.2018 21:33:01
Работать надо не 12 часов, а головой.
 
(?:шаблон) тоже самое что и (шаблон), но не заполняет SubMatches, то есть немного быстрее.
(?=шаблон) Путь в строке "раз два три четыре" мы хотим выделить только слова, разделённые пробелами.
Лобовой шаблон " ([а-я])+ " приведёт к тому, что будет найдено " два ", остаток строки "три четыре". То есть " три " не будет найдено.
Шаблон же " ([а-я])+(?= )" найдёт " два", остаток строки " три четыре", то есть позволит найти и слово три. Собственно об это и написано в примере
Цитата
"Windows(?=95|98)" подберёт подстроку "Windows" в строке "Windows95", но не в строке "WindowsNT". Дальнейший подбор начинается немедленно, а не после символов, входящих в скобки. НЕ фиксирует подбор в коллекции SubMatces
Символ _ - просто символ (слово из одного символа). Так затесался :) , можно удалить
Изменено: Андрей VG - 15.05.2018 09:25:07
 
Для чего тут стоит нижнее подчеркивание?
(?:ИП|ОАО|ЗАО|АО|ООО|фирма|ЧП|ТД|_)
Работать надо не 12 часов, а головой.
Страницы: 1
Наверх