Найти символы в тексте и заменить их на любые другие с учетом или без учета регистра или удалить их. Заменить или удалить любые буквы, цифры, знаки или символы в строке или во всём тексте.
Например:
— Заменить пробелы на запятые;
— Заменить кириллическую «а» на латинскую «a».
×
Пожалуйста напишите с чем связна такая низкая оценка:
×
Для установки калькулятора на iPhone — просто добавьте страницу
«На главный экран»
Для установки калькулятора на Android — просто добавьте страницу
«На главный экран»
Часто (очень часто) мы собираем документ, копируя и вставляя куски текста из других документов. Если мы пользуемся обычной вставкой из буфера обмена, то неизбежно «тащим» назначенный стиль, из одного документа в другой. В результате количество стиле в нашем документе растет в геометрической прогрессии (Урок 15 Лишние стили текста). А уроке 16 Буфер обмена я показала, как пользоваться специальной вставкой буфера обмена для того, чтобы не «тащить» в новый документ лишние стили. Но в этом случае списки перестанут быть списками, а превратиться в абзацы, начинающиеся с цифры. С маркированными списками будет та же беда: тире превратятся в символы. Если документ маленький, то можно и вручную осуществить операцию под название «замена символов), но это не для меня: у меня документ в 600 страниц считается маленьким.
Предположим, мы собираем новый текст из различных документов.
Вот исходный текст (я взяла кусок оглавления из готового учебного пособия):
Я скопировала часть оглавления и вставила в новый документ через специальную вставку из буфера обмена – «Сохранить только текст (С)» (лента Главная → группа команд Буфер обмена → кнопа выпадающего меню команды Вставить → команда Сохранить только текст):
Получила в результате:
Скачайте учебный файл тут. Вы можете скопировать текст из любого документа или даже из нескольких и работать со своим материалом. Начинаем работу под названием «замена символов».
По окончании урока вы сможете:
- Восстановить списки
- Проанализировать текст на предмет: какая замена символов необходима?
- Сделать замену символов.
1. Восстановление документа
Шаг 1. Вспомните Урок 2 «Выделяем текстовую информацию в документе Word» − функциональная клавиша Ctrl поможет нам выделять несмежную текстовую информацию. Выделяем все абзацы, которые начинаются на «число» и присваиваем им стиль «Заголовок 1»:
Шаг 2. Выделяем все абзацы, которые начинаются на «число.число» и присваиваем им стиль «Заголовок 2»:
Шаг 3. Выделяем все абзацы, которые начинаются на «число.число.число» и присваиваем им стиль «Заголовок 3»:
Просмотрите документ на наличие маркированных списков и задайте им стиль «Список_маркер» (разумеется, сначала надо создать этот стиль).
Понять и запомнить! | Я оставила цифры в начале каждого абзаца как ориентир уровня заголовков. |
2. Анализ текста
Теперь внимательно просмотрим текст: где нам понадобиться замена символов?
- Цифра– знак табуляции (1−>)
- Цифра – точка – цифра – знак табуляции (1.1−>)
- Цифра – точка – цифра – точка – цифра – знак табуляции (1.1.1−>)
- Цифра – точка – цифра – точка – цифра – цифра – знак табуляции (1.1.11−>)
- Знак табуляции – цифра (−>1)
- Знак табуляции – цифра – цифра (−>11)
- Знак табуляции – цифра – цифра – цифра (−>111)
Теперь можно заняться операцией «замена символов». Но есть одно «НО». Запись заменяемых символов должна быть уникальной. Кто даст гарантию, что где-нибудь по тексту не встретиться такая запись? А уникальным наши записи делает то, что они находятся либо в конце, либо в начале абзаца. Следовательно, надо добавить к записям непечатаемый символ конца абзаца.
3. Замена символов
Шаг 1. Открываем диалоговое окно «Найти и заменить» (лента Главная → группа команд Редактирование → команда Заменить):
Не забыли нажать кнопку «Больше», чтобы открыть диалоговое окно «Найти и заменить» во всей красе?
Шаг 2. Записываем в поле «Найти» первый набор символов, для чего последовательно нажимаем кнопку «Специальный» и выбираем из списка специальных символов:
Получаем в поле «Найти» выражение «^p^#^t».
Шаг 3. Записываем в поле «Заменить на» символ конца абзаца:
Если мы этого не сделаем, то искомые абзацы просто сольются с предыдущим абзацем.
ОК и сообщение:
Почему одна замена? Потому что первый абзац не имеет предыдущего абзаца, а документик маленький.
Шаг 4. Стираем запись в поле «Найти» записываем второй набор символов, для чего последовательно нажимаем кнопку «Специальный» и выбираем из списка специальных символов:
Получаем в поле «Найти» выражение «^p^#.^#^t».
Запись в поле «Заменить на» осталась.
ОК и сообщение:
Дальше я обойдусь без подробных скриншотов, а просто покажу те записи, которые должны быть в поле «Найти».
Шаг 5. Третье выражение: «^p^#.^#.^#.^t»
Шаг 6. Четвёртое выражение «^p^#.^#.^#^#^t»
Шаг 7. Пятое выражение «^t^#^p»
Шаг 8. Шестое выражение «^t^#^#^p»
Шаг 9. Седьмое выражение «^t^#^#^#^p»
ОК. Не забудем удалить самую первую цифру и знак табуляции. Смотрим финал:
Маленькое «НО». Обычно я начинаю подобную замену с бо́льшего выражения. Сравните «1», «1.1» и «1.1.1» (и это ещё самый простой случай). Если я сначала начну заменять «^p^#^t», то и в одном выражении, и в другом и в третьем удалиться первая цифра, и мы получим: в первом случае всё будет хорошо, во втором – «.1», в третьем – «.1.1». поэтому проанализируйте документ, найдите самое большое выражение и начинайте замену. То есть начинайте с шага 9 и двигайтесь по шагам в обратном направлении
Теперь можно начинать работу по форматированию документа.
Теперь вы можете:
- Восстановить списки
- Проанализировать текст на предмет: какая замена символов необходима?
- Сделать замену символов.
Диалоговое окно «Найти и заменить» − самое моё любимое! На втором месте стоит диалоговое окно «Управление стилями» (Урок 49).
Возможности
Если при работе с большими объемами текста вам требуется найти и заменить слово или фразу, а также удалить или найти вхождение элемента, то используйте встроенные функции программы:
- Найти и заменить — находит и заменяет элемент.
- Найти и удалить — находит и удаляет нужный элемент.
- Найти и подсветить — находит искомое значение и подсвечивает контрастным цветом.
Незаменимый помощник для редактора, копирайтера, маркетолога и специалиста по контекстной рекламе. Скрипт производит массовые операции во всем тексте с символами (пробелы, иконки, знаки), а также буквами, словами, выражениями, словосочетаниями и фразами.
Подстановочные символы (скоро)
Подстановочные знаки можно использовать при поиске и замене содержимого, когда искомое значение может удовлетворять множеству значений.
? (вопросительный знак) — используется в качестве фильтра для одного любого символа. Например, условие «дро?а» будет соответствовать словам «дрова» , «дрофа» или «дрона» .
* (звездочка) — используется чтобы найти выражение с любым количеством символов. Для примера, условие «красн*» соответствует словам «красная» , красного» , «краснуха» , «красненького» и т.д.
Инструмент заменяет привычный Word и Excel и позволяет искать, заменять или удалять элементы онлайн, когда привычные пакетные офисные программы отсутствуют под рукой.
Инструкция
Найти и заменить
- Выберите функцию Найти и заменить (доступа по умолчанию);
- Вставьте исходный текст для изменения;
- В строке Найти укажите искомое слово или фразу;
- В поле Заменить введите новое значение;
- Нажмите на кнопку Выполнить. Алгоритм найдет все вхождения и заменит.
Найти и удалить
- Выберите функцию Найти и удалить;
- Вставьте исходный текст в текстовое окно;
- В строке Найти укажите слово или фразу для удаления;
- Нажмите на Выполнить. Алгоритм удалит все найденные значения.
Найти и выделить
- Чтобы подсветить буквы или слово, выберите нужную функцию;
- Укажите ключ-значение в поле Найти;
- Далее кнопка Выполнить для определения всех значений.
Примечание. В нижней части формы программа укажет сколько было найдено и изменено вхождений в тексте.
С лёгкостью можно отправить полученный результат в буфер обмена — просто нажмите на кнопку Скопировать в самом низу.
Что важного в диджитал на этой неделе?
Каждую субботу я отправляю письмо с новостями, ссылками на исследования и статьи, чтобы вы не пропустили ничего важного в интернет-маркетинге за неделю.
Узнать подробнее →
Представление символов в регулярных выражениях
Регулярные выражения (англ. regular expressions) — используемый в компьютерных программах, работающих с текстом, формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). Для поиска используется строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска. Для манипуляций с текстом дополнительно задаётся строка замены, которая также может содержать в себе специальные символы.
Возможности
Набор утилит (включая редактор sed и фильтр grep), поставляемых в дистрибутивах UNIX, одним из первых способствовал популяризации регулярных выражений для обработки текстов. Многие современные языки программирования имеют встроенную поддержку регулярных выражений. Среди них ActionScript, Perl, Java,PHP, JavaScript, языки платформы .NET Framework[2], Python, Tcl, Ruby, Lua, Gambas, C++ (стандарт 2011 года), Delphi, D, Haxe и другие.
Регулярные выражения используются некоторыми текстовыми редакторами и утилитами для поиска и подстановки текста. Например, при помощи регулярных выражений можно задать шаблоны, позволяющие:
- найти все последовательности символов «кот» в любом контексте, как то: «кот», «котлета», «терракотовый»;
- найти отдельно стоящее слово «кот» и заменить его на «кошка»;
- найти слово «кот», которому предшествует слово «персидский» или «чеширский»;
- убрать из текста все предложения, в которых упоминается слово кот или кошка.
Регулярные выражения позволяют задавать и гораздо более сложные шаблоны поиска или замены.
Результатом работы с регулярным выражением может быть:
- проверка наличия искомого образца в заданном тексте;
- определение подстроки текста, которая сопоставляется образцу;
- определение групп символов, соответствующих отдельным частям образца.
Если регулярное выражение используется для замены текста, то результатом работы будет новая текстовая строка, представляющая из себя исходный текст, из которого удалены найденные подстроки (сопоставленные образцу), а вместо них подставлены строки замены (возможно, модифицированные запомненными при разборе группами символов из исходного текста). Частным случаем модификации текста является удаление всех вхождений найденного образца — для чего строка замены указывается пустой.
История
Истоки регулярных выражений лежат в теории автоматов, теории формальных языков и классификации формальных грамматик по Хомскому.
Эти области изучают вычислительные модели (автоматы) и способы описания и классификации формальных языков. В 1940-х гг. Уоррен Маккалок и Уолтер Питтс описали нейронную систему, используя простой автомат в качестве модели нейрона.
Математик Стивен Клини позже описал эти модели, используя свою систему математических обозначений, названную «регулярные множества».
Кен Томпсон встроил их в редактор QED, а затем в редактор ed под UNIX. С этого времени регулярные выражения стали широко использоваться в UNIX и UNIX-подобных утилитах, например в expr, awk, Emacs, vi, lex и Perl.
Регулярные выражения в Perl и Tcl происходят от реализации, написанной Генри Спенсером. Филип Хейзел разработал библиотеку PCRE (англ. Perl-compatible regular expressions — Perl-совместимые регулярные выражения), которая используется во многих современных инструментах, таких как PHP и Apache.
В теории формальных языков
Основная статья: Регулярный язык
Регулярные выражения состоят из констант и операторов, которые определяют множества строк и множества операций на них соответственно. Определены следующие константы:
- (пустое множество) ∅;
- (пустая строка) ε обозначает строку, не содержащую ни одного символа; эквивалентно «»;
- (символьный литерал) «a», где a — символ используемого алфавита;
- (множество) из символов, либо из других множеств;
и следующие операции:
- (сцепление, конкатенация) RS обозначает множество {αβ | α ∈ R & β ∈ S}, например: {«boy», «girl»}{«friend», «cott»} = {«boyfriend», «girlfriend», «boycott», «girlcott»};
- (дизъюнкция, чередование) R|S обозначает объединение R и S, например: {«ab», «c»}|{«ab», «d», «ef»} = {«ab», «c», «d», «ef»}[4];
- (замыкание Клини, звезда Клини) R* обозначает минимальное надмножество множества R, которое содержит ε и замкнуто относительно конкатенации (это есть множество всех строк, полученных конкатенацией нуля или более строк из R, например: {«Run», «Forrest»}* = {ε, «Run», «Forrest», «RunRun», «RunForrest», «ForrestRun», «ForrestForrest», «RunRunRun», «RunRunForrest», «RunForrestRun», …}).
Регулярные выражения, входящие в современные языки программирования (в частности, PCRE), имеют больше возможностей, чем то, что называется регулярными выражениями в теории формальных языков; в частности, в них есть нумерованные обратные ссылки[⇨]. Это позволяет им разбирать строки, описываемые не только регулярными грамматиками, но и более сложными, в частности, контекстно-свободными грамматиками.
Синтаксис
Представление символов
Основная статья: Представление символов в регулярных выражениях
Обычные символы (литералы) и специальные символы (метасимволы)
Большинство символов в регулярном выражении представляют сами себя за исключением специальных символов [
]
/
^
$
.
|
?
*
+
(
)
{
}
(в разных типах регулярных выражений этот набор различается, см. Разновидности регулярных выражений), которые могут быть экранированы символом (обратная косая черта) для представления самих себя в качестве символов текста. Можно экранировать целую последовательность символов, заключив её между
Q
и E
.
Пример | Соответствие |
---|---|
a.? |
a. или a |
a\\b |
a\b |
a[F] |
a[F] |
Q+-*/E |
+-*/ |
Аналогично могут быть представлены другие специальные символы (набор символов, требующих экранирования, может отличаться в зависимости от конкретной реализации). Часть символов, которые в той или иной реализации не требуют экранирования (например, угловые скобки <
>
), могут быть экранированы из соображений удобочитаемости.
Любой символ
Метасимвол .
(точка) означает один любой символ, но в некоторых реализациях исключая символ новой строки.
Вместо символа .
можно использовать [sS]
(все пробельные и непробельные символы, включая символ новой строки).
Символьные классы (наборы символов)
Набор символов в квадратных скобках [
]
именуется символьным классом и позволяет указать интерпретатору регулярных выражений, что на данном месте в строке может стоять один из перечисленных символов. В частности, [абв]
задаёт возможность появления в тексте одного из трёх указанных символов, а [1234567890]
задаёт соответствие одной из цифр. Возможно указание диапазонов символов: например, [А-Яа-я]
соответствует всем буквам русского алфавита, за исключением букв «Ё» и «ё»[7]. Некоторые реализации регулярных выражений могут позволять включать в символьные классы не только символы, но и целые строки.[8]
Если требуется указать символы, которые не входят в указанный набор, то используют символ ^
внутри квадратных скобок, например [^0-9]
означает любой символ, кроме цифр.
Добавление в набор специальных символов путём экранирования — самый бесхитростный способ. Однако в современных регулярных выражениях унаследован также и традиционный подход — см. Традиционные регулярные выражения.
Некоторые символьные классы можно заменить специальными метасимволами:
Символ | Возможный эквивалент[9] | Соответствие |
---|---|---|
d |
[0-9] |
Цифровой символ |
D |
[^0-9] |
Нецифровой символ |
s |
[ fnrtv] |
Пробельный символ |
S |
[^ fnrtv] |
Непробельный символ
|
w[10] |
[A-Za-z0-9_] |
Буквенный или цифровой символ или знак подчёркивания; буквы ограничены латиницей
|
W[11] |
[^A-Za-z0-9_] |
Любой символ, кроме буквенного или цифрового символа или знака подчёркивания |
Позиция внутри строки
Следующие символы позволяют спозиционировать регулярное выражение относительно элементов текста: начала и конца строки, границ слова.
Представление | Позиция | Пример | Соответствие |
---|---|---|---|
^ |
Начало текста (или строки при модификаторе ?m) | ^a |
aaa aaa |
$ |
Конец текста (или строки при модификаторе ?m) | a$ |
aaa aaa |
b |
Граница слова | ab |
aaa aaa |
ba |
aaa aaa |
||
B |
Не граница слова | BaB |
aaa aaa |
G |
Предыдущий успешный поиск | Ga |
aaa aaa (поиск остановился на 4-й позиции — там, где не нашлось a ) |
Специальные символы
n — перевод строки
r — возврат каретки
Обозначение группы
Круглые скобки используются для определения области действия и приоритета операций. Шаблон внутри группы обрабатывается как единое целое и может быть квантифицирован. Например, выражение (тр[ау]м-?)*
найдёт последовательность вида трам-трам-трумтрам-трум-трамтрум
.
Перечисление
Вертикальная черта разделяет допустимые варианты. Например, gray|grey
соответствует gray
или grey
. Следует помнить, что перебор вариантов выполняется слева направо, как они указаны.
Если требуется указать перечень вариантов внутри более сложного регулярного выражения, то его нужно заключить в группу. Например, gray|grey
или gr(a|e)y
описывают строку gray
или grey
. В случае с односимвольными альтернативами предпочтителен вариант gr[ae]y
, так как сравнение с символьным классом выполняется проще, чем обработка группы с проверкой на все её возможные модификаторы и генерацией обратной связи.
Квантификация (поиск последовательностей)
Квантификатор после символа, символьного класса или группы определяет, сколько раз предшествующее выражение может встречаться. Следует учитывать, что квантификатор может относиться более чем к одному символу в регулярном выражении, только если это символьный класс или группа.
Представление | Число повторений | Эквивалент | Пример | Соответствие |
---|---|---|---|---|
? |
Ноль или одно | {0,1} |
colou?r |
color , colour |
* |
Ноль или более | {0,} |
colou*r |
color , colour , colouur и т. д. |
+ |
Одно или более | {1,} |
colou+r |
colour , colouur и т. д. (но не color ) |
Представление | Число повторений | Пример | Соответствие |
---|---|---|---|
{n} |
Ровно n раз | colou{3}r |
colouuur |
{m,n} |
От m до n включительно | colou{2,4}r |
colouur , colouuur , colouuuur |
{m,} |
Не менее m | colou{2,}r |
colouur , colouuur , colouuuur и т. д. |
{,n} |
Не более n | colou{,3}r |
color , colour , colouur , colouuur |
Часто используется последовательность .*
для обозначения любого количества любых символов между двумя частями регулярного выражения.
Символьные классы в сочетании с квантификаторами позволяют устанавливать соответствия с реальными текстами. Например, столбцами цифр, телефонами, почтовыми адресами, элементами HTML-разметки и др.
Если символы {
}
не образуют квантификатора, их специальное значение игнорируется.
Жадная и ленивая квантификация
Пример использования жадных и ленивых выражений
Выражение (<.*>)
соответствует строке, содержащей несколько тегов HTML-разметки, целиком.
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
Чтобы выделить отдельные теги, можно применить ленивую версию этого выражения: (<.*?>)
Ей соответствует не вся показанная выше строка, а отдельные теги (выделены цветом):
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
В некоторых реализациях квантификаторам в регулярных выражениях соответствует максимально длинная строка из возможных (квантификаторы являются жадными, англ. greedy). Это может оказаться значительной проблемой. Например, часто ожидают, что выражение (<.*>)
найдёт в тексте теги HTML. Однако если в тексте есть более одного HTML-тега, то этому выражению соответствует целиком строка, содержащая множество тегов.
<p><b>Википедия</b> — свободная энциклопедия, в которой <i>каждый</i> может изменить или дополнить любую статью.</p>
Эту проблему можно решить двумя способами.
- Учитывать символы, не соответствующие желаемому образцу (
<[^>]*>
для вышеописанного случая). - Определить квантификатор как нежадный (ленивый, англ. lazy) — большинство реализаций позволяют это сделать, добавив после него знак вопроса.
Использование ленивых квантификаторов может повлечь за собой обратную проблему, когда выражению соответствует слишком короткая, в частности, пустая строка.
Жадный | Ленивый |
---|---|
* |
*? |
+ |
+? |
{n,} |
{n,}? |
Также общей проблемой как жадных, так и ленивых выражений являются точки возврата для перебора вариантов выражения. Точки ставятся после каждой итерации квантификатора. Если интерпретатор не нашёл соответствия после квантификатора, то он начинает возвращаться по всем установленным точкам, пересчитывая оттуда выражение по-другому.
Ревнивая квантификация (сверхжадная)
При поиске выражения (a+a+)+a
в строке aaaaa
интерпретатор пойдёт приблизительно по следующему пути:
aaaaa
aaaa
aaaaa
aaa
aaaaa
aaaa
aaaaa
— и только тут, проверив все точки возврата, остановится.
При использовании ревнивого квантификатора будет выполнен только первый шаг алгоритма.
В отличие от обычной (жадной) квантификации, ревнивая (possessive) квантификация не только старается найти максимально длинный вариант, но ещё и не позволяет алгоритму возвращаться к предыдущим шагам поиска для того, чтобы найти возможные соответствия для оставшейся части регулярного выражения.
Использование ревнивых квантификаторов увеличивает скорость поиска, особенно в тех случаях, когда строка не соответствует регулярному выражению. Кроме того, ревнивые квантификаторы могут быть использованы для исключения нежелательных совпадений.
Жадный | Ревнивый |
---|---|
* |
*+ |
? |
?+ |
+ |
++ |
{n,} |
{n,}+ |
Пример | Соответствие |
---|---|
ab(xa)*+a |
abxaabxaa ; но не abxaabxaa , так как буква a уже занята |
Это аналогично атомарной группировке.
Группировка
Обратная связь
Одно из применений группировки — повторное использование ранее найденных групп символов (подстрок, блоков, отмеченных подвыражений, захватов). При обработке выражения подстро́ки, найденные по шаблону внутри группы, сохраняются в отдельной области памяти и получают номер, начиная с единицы. Каждой подстроке соответствует пара скобок в регулярном выражении. Квантификация группы не влияет на сохранённый результат, то есть сохраняется лишь первое вхождение. Обычно поддерживается до 9 нумерованных подстрок с номерами от 1 до 9, но некоторые интерпретаторы позволяют работать с бо́льшим количеством. Впоследствии в пределах данного регулярного выражения можно использовать обозначения от 1
до 9
для проверки на совпадение с ранее найденной подстрокой.
Например, регулярное выражение (та|ту)-1
найдёт строку та-та
или ту-ту
, но пропустит строку та-ту
.
Также ранее найденные подстро́ки можно использовать при замене по регулярному выражению. В таком случае в замещающий текст вставляются те же обозначения, что и в пределах самого выражения.
Группировка без обратной связи
Если группа используется только для группировки и её результат в дальнейшем не потребуется, то можно использовать группировку вида (?:шаблон)
. Под результат такой группировки не выделяется отдельная область памяти и, соответственно, ей не назначается номер. Это положительно влияет на скорость выполнения выражения, но понижает удобочитаемость.
Атомарная группировка
Атомарная группировка вида (?>шаблон)
также, как и группировка без обратной связи, не создаёт обратных связей. В отличие от неё, такая группировка запрещает возвращаться назад по строке, если часть шаблона уже найдена.
Пример | Соответствие | Создаваемые группы |
---|---|---|
a(bc|b|x)cc |
abccaxcc
|
abccaxcc
|
a(?:bc|b|x)cc |
abccaxcc , abccaxcc |
нет |
a(?>bc|b|x)cc |
abccaxcc
но не |
нет |
a(?>x*)xa |
не найдётся axxxa : все x заняты, и нет возврата внутрь группы |
Атомарная группировка выполняется ещё быстрее, чем группировка без обратной связи, и сохраняет процессорное время при выполнении остального выражения, так как запрещает проверку любых других вариантов внутри группы, когда один вариант уже найден. Это очень полезно при оптимизации групп со множеством различных вариантов.
Это аналогично ревнивой квантификации.
Модификаторы
Модификаторы действуют с момента вхождения и до конца регулярного выражения или противоположного модификатора. Некоторые интерпретаторы могут применить модификатор ко всему выражению, а не с момента его вхождения.
Синтаксис | Описание | |
---|---|---|
(?i) |
Включает | нечувствительность выражения к регистру символов (англ. case insensitivity) |
(?-i) |
Выключает | |
(?s) |
Включает | режим соответствия точки символам переноса строки и возврата каретки |
(?-s) |
Выключает | |
(?m) |
Символы ^ и $ вызывают соответствие только |
после и до символов новой строки |
(?-m) |
с началом и концом текста | |
(?x) |
Включает | режим без учёта пробелов между частями регулярного выражения и позволяет использовать # для комментариев |
(?-x) |
Выключает |
Группы-модификаторы можно объединять в одну группу: (?i-sm)
. Такая группа включает режим i
и выключает режим s
, m
. Если использование модификаторов требуется только в пределах группы, то нужный шаблон указывается внутри группы после модификаторов и после двоеточия. Например, (?-i)(?i:tv)set
найдёт TVset
, но не TVSET
.
Комментарии
Для добавления комментариев в регулярное выражение можно использовать группы-комментарии вида (?#комментарий)
. Такая группа интерпретатором полностью игнорируется и не проверяется на вхождение в текст. Например, выражение А(?#тут комментарий)Б
соответствует строке АБ
.
Просмотр вперёд и назад
В большинстве реализаций регулярных выражений есть способ производить поиск фрагмента текста, «просматривая» (но не включая в найденное) окружающий текст, который расположен до или после искомого фрагмента текста. Просмотр с отрицанием используется реже и «следит» за тем, чтобы указанные соответствия, напротив, не встречались до или после искомого текстового фрагмента.
Представление | Вид просмотра | Пример | Соответствие |
---|---|---|---|
(?=шаблон) |
Позитивный просмотр вперёд | Людовик(?=XVI) |
ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL |
(?!шаблон) |
Негативный просмотр вперёд (с отрицанием) | Людовик(?!XVI) |
ЛюдовикXV, ЛюдовикXVI, ЛюдовикXVIII, ЛюдовикLXVII, ЛюдовикXXL |
(?<=шаблон) |
Позитивный просмотр назад | (?<=Сергей )Иванов |
Сергей Иванов, Игорь Иванов |
(?<!шаблон) |
Негативный просмотр назад (с отрицанием) | (?<!Сергей )Иванов |
Сергей Иванов, Игорь Иванов |
Поиск по условию
Во многих реализациях регулярных выражений существует возможность выбирать, по какому пути пойдёт проверка в том или ином месте регулярного выражения на основании уже найденных значений.
Представление | Пояснение | Пример | Соответствие |
---|---|---|---|
(?(?=если)то|иначе) |
Если операция просмотра успешна, то далее выполняется часть то , иначе выполняется часть иначе . В выражении может использоваться любая из четырёх операций просмотра. Следует учитывать, что операция просмотра нулевой ширины, поэтому части то в случае позитивного или иначе в случае негативного просмотра должны включать в себя описание шаблона из операции просмотра. |
(?(?<=а)м|п) |
мам,пап |
(?(n)то|иначе) |
Если n-я группа вернула значение, то поиск по условию выполняется по шаблону то , иначе по шаблону иначе . |
(а)?(?(1)м|п) |
мам,пап |
Флаги
В некоторых языках (например, в JavaScript) реализованы т. н. «флаги», которые расширяют функции RegExp. Флаги указываются после регулярного выражения (порядок флагов значения не имеет). Типичные флаги:
- g — глобальный поиск (обрабатываются все совпадения с шаблоном поиска);
- i — регистр букв не имеет значения;
- m — многострочный поиск;
- s — текст трактуется как одна строка, в этом случае метасимволу
.
(точка) соответствует любой одиночный символ, включая символ новой строки; - u — unicode трактовка. Выражение может содержать специальные паттерны, характерные для юникода, например,
/p{Lu}/
— заглавные буквы.
Флаг указывается после паттерна, например, вот так: /[0-9]$/m
.
Разновидности регулярных выражений
Базовые регулярные выражения POSIX
(англ. basic regular expressions (BRE)). Традиционные регулярные выражения UNIX. Синтаксис базовых регулярных выражений на данный момент определён POSIX’ом как устаревший, но он до сих пор широко распространён из соображений обратной совместимости. Многие UNIX-утилиты используют такие регулярные выражения по умолчанию.
В данную версию включены метасимволы:
.
;[
]
;[^
]
;^
(действует только в начале выражения);$
(действует только в конце выражения);*
;{
}
— первоначальный вариант для{
}
;(
)
— первоначальный вариант для(
)
;n
, где n — номер от 1 до 9.
Особенности:
- Звёздочка должна следовать после выражения, соответствующего единичному символу. Пример:
[xyz]*
. - Выражение
(блок)*
следует считать неправильным. В некоторых случаях оно соответствует нулю или более повторений строкиблок
. В других оно соответствует строкеблок*
. - Внутри символьного класса специальные значения символов, в основном, игнорируются. Особые случаи:
- Чтобы добавить символ
^
в набор, его следует поместить туда не первым. - Чтобы добавить символ
-
в набор, его следует поместить туда первым или последним. Например: - шаблон DNS-имени, куда могут входить буквы, цифры, минус и точка-разделитель:
[-0-9a-zA-Z.]
; - любой символ, кроме минуса и цифры:
[^-0-9]
. - Чтобы добавить символ
[
или]
в набор, его следует поместить туда первым. Например: [][ab]
соответствует]
,[
,a
илиb
.
Расширенные регулярные выражения POSIX
(англ. extended regular expressions (ERE)). Синтаксис в основном аналогичен традиционному.
- Отменено использование обратной косой черты для метасимволов
{ }
и( )
. - Обратная косая черта перед метасимволом отменяет его специальное значение (см. Представление специальных символов).
- Отвергнута теоретически нерегулярная конструкция
n
. - Добавлены метасимволы
+
,?
,|
.
См. также: Символьные классы POSIX
Регулярные выражения, совместимые с Perl
Perl-совместимые регулярные выражения (англ. Perl-compatible regular expressions (PCRE)) имеют более богатый синтаксис, чем даже POSIX ERE. По этой причине очень многие приложения используют именно Perl-совместимый синтаксис регулярных выражений.
Регулярные выражения, совместимые с Unicode
Основной источник: UTS #18: Unicode Regular Expressions.
Unicode — это набор символов, целью которого является определение всех символов и символов со всех человеческих языков, живых и мертвых. Регулярные выражения, рассчитанные на множество языков, таким образом не привязываются к конкретным наборам символов, а описывают их согласно принятым правилам. Так, например, выражение для нахождения заглавных букв в любом алфавите будет выглядеть так: /p{Lu}/
.
представление | функциональность | |
---|---|---|
возможная краткая форма | возможная полная форма | |
Буквы | ||
p{L} |
p{Letter} |
любые буквы любого языка |
p{Ll} |
p{Lowercase_Letter} |
буквы нижнего регистра (строчные) из тех, что имеют прописной вариант написания |
p{Lu} |
p{Uppercase_Letter} |
буквы верхнего регистра (прописные) для тех, что имеют строчный вариант написания |
p{Lt} |
p{Titlecase_Letter} |
прописная буква, которая появляется с начала слова из строчных букв |
p{L&} |
p{Cased_Letter} |
буква, которая имеет как прописной, так и строчный варианты написания |
p{Lm} |
p{Modifier_Letter} |
специальные символы, которые используются как буквы |
p{Lo} |
p{Other_Letter} |
символ или идеограмма, которая не имеет прописных и строчных вариантов написания |
Специальные символы | ||
p{M} |
p{Mark} |
символы, вставленные для комбинирования с другими символами (например акценты, умляуты, оборачивающие скобки) |
p{Mn} |
p{Non_Spacing_Mark} |
символ, вставленный для комбинирования с другими символами, не занимая дополнительной ширины |
p{Mc} |
p{Spacing_Combining_Mark} |
символы, вставленные для комбинирования с другими символами, занимая дополнительную ширину (как во многих восточных языках) |
p{Me} |
p{Enclosing_Mark} |
символы, которые оборачивают символ. Например круг, квадрат и т.п |
Пробелы и разделители | ||
p{Z} |
p{Separator} |
любые виды пробелов или невидимых разделителей |
p{Zs} |
p{Space_Separator} |
пробельные символы, которые невидимы, но имеют ширину |
p{Zl} |
p{Line_Separator} |
символ разделения в виде линии U+2028 |
p{Zp} |
p{Paragraph_Separator} |
знак параграфа U+2029 |
Математические символы | ||
p{S} |
p{Symbol} |
математические символы, символы валюты, символы псевдографики (рамки) и т. п. |
p{Sm} |
p{Math_Symbol} |
любые математические символы |
p{Sc} |
p{Currency_Symbol} |
любые символы валют |
p{Sk} |
p{Modifier_Symbol} |
комбинированный символ (пометка) как комбинация самого символа и символа отметки |
p{So} |
p{Other_Symbol} |
различные символы, не математические, не символы валют или их комбинации |
Цифровые символы | ||
p{N} |
p{Number} |
любые виды цифровых символов в любых языках |
p{Nd} |
p{Decimal_Digit_Number} |
цифры от нуля до девятки в любых языках |
p{Nl} |
p{Letter_Number} |
число, которое может выглядеть как буквы, например как римские числа |
p{No} |
p{Other_Number} |
число, представленное как верхний или нижний индекс, или число, которое не состоит из цифр (исключая числа из идеографических письменностей) |
Знаки пунктуации | ||
p{P} |
p{Punctuation} |
любой вид пунктуационных знаков |
p{Pd} |
p{Dash_Punctuation} |
любой вид дефисов или тире |
p{Ps} |
p{Open_Punctuation} |
любой вид открывающих скобок |
p{Pe} |
p{Close_Punctuation} |
любой вид закрывающих скобок |
p{Pi} |
p{Initial_Punctuation} |
любой вид открывающих кавычек |
p{Pf} |
p{Final_Punctuation} |
любой вид закрывающих кавычек |
p{Pc} |
p{Connector_Punctuation} |
пунктуационные символы, такие как знаки подчёркивания или соединения слов |
p{Po} |
p{Other_Punctuation} |
любые виды пунктуационных символов, что не являются точками, скобками, кавычками или соединителями |
Управляющие символы | ||
p{C} |
p{Other} |
невидимые управляющие символы и неиспользуемые позиции |
p{Cc} |
p{Control} |
ASCII или Latin-1 управляющие символы: 0x00-0x1F и 0x7F-0x9F |
p{Cf} |
p{Format} |
невидимые индикаторы форматирования |
p{Co} |
p{Private_Use} |
любые позиции, зарезервированные для личного использования |
p{Cs} |
p{Surrogate} |
половина суррогатных пар в кодировке UTF-16 |
p{Cn} |
p{Unassigned} |
любые позиции, у которых не назначены символы |
Нечёткие регулярные выражения
В некоторых случаях регулярные выражения удобно применить для анализа текстовых фрагментов на естественном языке, то есть написанных людьми, и, возможно, содержащих опечатки либо нестандартные варианты употреблений слов. Например, если проводить опрос (допустим, на веб-сайте) «какой станцией метро вы пользуетесь», может оказаться, что «Невский проспект» посетители могут указать как:
- Невский
- Невск. просп.
- Нев. проспект
- наб. Канала Грибоедова («Канал Грибоедова» — это название второго выхода ст. м. Невский проспект)
Здесь обычные регулярные выражения неприменимы, в первую очередь из-за того, что входящие в образцы слова могут совпадать не очень точно (нечётко), но, тем не менее, было бы удобно описывать регулярными выражениями структурные зависимости между элементами образца, например в нашем случае указать, что совпадение может быть с образцом «Невский проспект» ИЛИ «Канал Грибоедова», притом «проспект» может быть сокращено до «пр» или отсутствовать, а перед «Канал» может находиться сокращение «наб.».
Эта задача сродни полнотекстовому поиску, отличаясь в том, что здесь короткий фрагмент должен сравниваться с набором образцов, а при полнотекстовом поиске, наоборот, образец обычно один, в то время как фрагмент текста очень большой, или задаче разрешения лексической многозначности, которая, однако, не позволяет задать структурирующие отношения между элементами образца.
Существует небольшое количество библиотек, реализующих механизм регулярных выражений с возможностью нечёткого сравнения:
- TRE — бесплатная библиотека на С, использующая синтаксис регулярных выражений, похожий на POSIX (стабильный проект);
- FREJ — open-source библиотека на Java, использующая Lisp-образный синтаксис и лишённая многих возможностей обычных регулярных выражений, но сосредоточенная на различного рода автоматических заменах фрагментов текста (бета-версия).
Реализации
- NFA (англ. nondeterministic finite-state automata — недетерминированные конечные автоматы) используют жадный алгоритм отката, проверяя все возможные расширения регулярного выражения в определённом порядке и выбирая первое подходящее значение. NFA может обрабатывать подвыражения и обратные ссылки. Но из-за алгоритма отката традиционный NFA может проверять одно и то же место несколько раз, что отрицательно сказывается на скорости работы. Поскольку традиционный NFA принимает первое найденное соответствие, он может и не найти самое длинное из вхождений (этого требует стандарт POSIX, и существуют модификации NFA, выполняющие это требование — GNU sed). Именно такой механизм регулярных выражений используется, например, в Perl, Tcl и .NET.
- DFA (англ. deterministic finite-state automata — детерминированные конечные автоматы) работают линейно по времени, поскольку не используют откаты и никогда не проверяют какую-либо часть текста дважды. Они могут гарантированно найти самую длинную строку из возможных. DFA содержит только конечное состояние, следовательно, не обрабатывает обратных ссылок, а также не поддерживает конструкций с явным расширением, то есть не способен обработать и подвыражения. DFA используется, например, в lex и egrep.
Представление символов по их коду
В некоторых случаях предпочтительно представление символов по их коду.
Представление | Пояснение | Кодировка |
---|---|---|
n |
n — восьмеричное число от 0 до 377 | 8-битная |
xdd |
d — шестнадцатеричная цифра | |
udddd |
16-битная (Юникод) |
Управляющие символы
Представление | Символ | Обозначение | Расшифровка |
---|---|---|---|
t |
Горизонтальная табуляция | HT |
Horizontal tabulation |
v |
Вертикальная табуляция | VT |
Vertical tabulation |
r |
Возврат каретки | CR |
Carriage return |
n |
Перевод строки (прогон строки, подача строки) | LF |
Line feed |
f |
Конец страницы (прогон страницы) | FF |
Form feed |
a |
Звонок | BEL |
Bell character |
e |
Ключ (управляющий символ, Escape-символ) | ESC |
Escape character |
b |
Backspace
Должен находиться внутри квадратных скобок (иначе интерпретируется как граница слова). |
BS |
Backspace |
cA … cZ |
Ctrl+A … Ctrl+Z
Например, последовательность Эквивалентно |
Сокращённые обозначения символьных классов
Для часто используемых символьных классов существуют краткие обозначения.
Представление | Эквивалент | Значение |
---|---|---|
d |
[0-9] |
Цифра |
D |
[^d] |
Любой символ, кроме цифры |
w |
[A-Za-zА-Яа-я0-9_] |
Символы, образующие «слово» (буквы, цифры и символ подчёркивания)[1] |
W |
[^w] |
Символы, не образующие «слово» |
s |
[ tvrnf] |
Пробельный символ |
S |
[^s] |
Непробельный символ |
Символьные классы POSIX
Многие диапазоны символов зависят от выбранных настроек локализации. POSIX стандартизовал объявление некоторых классов и категорий символов, как показано в следующей таблице.
POSIX-класс | Эквивалент | Значение |
---|---|---|
[:upper:] |
[A-Z] |
Символы верхнего регистра |
[:lower:] |
[a-z] |
Символы нижнего регистра |
[:alpha:] |
[[:upper:][:lower:]] |
Буквы |
[:digit:] |
[0-9] , т. е. d |
Цифры |
[:xdigit:] |
[[:digit:]A-Fa-f] |
Шестнадцатеричные цифры |
[:alnum:] |
[[:alpha:][:digit:]] |
Буквы и цифры |
[:word:] |
[[:alnum:]_] , т. е. w |
Символы, образующие «слово» |
[:punct:] |
[-!"#$%&'()*+,./:;<=>?@[\]_`{|}~] |
Знаки пунктуации |
[:blank:] |
[ t] |
Пробел и табуляция |
[:space:] |
[[:blank:]vrnf] , т. е. s |
Пробельные символы |
[:cntrl:] |
[x00-x1Fx7F] |
Управляющие символы |
[:graph:] |
[x21-x7E] |
Печатные символы |
[:print:] |
[x20-x7E] , т. е. [[:graph:] ] |
Печатные символы с пробелом |
Символы
. | Точка. Обозначает любой символ |
Экранирующий символ. Символы которые экранируются: ^, [, ., $, {, *, (, ), , +, |, ?, <, > | |
^ | Крышка. Начало строки |
$ | Конец строки |
d | Любая цифра |
D | Не цифра |
s | Пробел, табуляция, перенос строки |
S | Не пробел |
w | Любая буква латиницы, цифра, или знак подчёркивания |
W | Не латиница, не цифра, не подчёркивание |
| | Или. Соединяет несколько вариантов |
b | Граница слова. Применяется когда нужно выделить, что искомые символы являются словом, а не частью другого слова |
B | Не граница слова |
< | Начало слова |
> | Конец слова |
A | Начало текста |
Z | Конец текста |
* | Повторитель. Означает что предшествующий символ может работать 0 и более раз |
+ | Количество предшествующего не менее 1-го. |
? | Ограничитель. Не более одного раза |
[ ] | В квадратных скобках задаются символы к поиску, например [a-яА-Я], или [0-9] |
[^ ] | Исключает из поиска символы указанные в квадратных скобках |
() | В круглые скобки заключаются все комбинации с «или» и поиск начала и конца строк |
{ } | В фигурных скобках указывается точное количество вхождений, например если надо две цифры, то d{2}, если две или четыре, то d{2,4}, если четыре и более, то {4,} |
n | Новая строка |
Использование класса возможно лишь внутри квадратных скобок (пример частой ошибки — ^[:upper:]il+$
вместо ^[[:upper:]]il+$
).
Источник:
https://ru.wikipedia.org/wiki/Регулярные_выражения#Специальные_символы
https://ru.wikipedia.org/wiki/Представление_символов_в_регулярных_выражениях
- Код машин
В дополнение к поиску и замене текста Word позволяет искать специальные символы — табуляции, отступы, знаки абзаца и т. Д. — а затем заменять их другими специальными символами. Это может быть удобно для быстрых и простых изменений, которые обычно требуют немного больше времени для внесения вручную.
Когда полезны поиск и замена специальных символов?
Чтобы понять, когда может быть полезен поиск и замена специальных символов, давайте рассмотрим несколько примеров.
Допустим, вам нужно отредактировать объемный юридический документ. Вас попросили заменить слово «раздел» на символ раздела. Символ раздела представляет собой пару перекрывающихся символов «S» и часто используется в юридических документах для ссылки на пронумерованный раздел документа. В вашем документе более 50 страниц, и в нем есть множество ссылок на различные разделы. Вы можете легко заменить слово «раздел» на символ раздела с помощью поиска и замены.
Вы только что закончили писать черновик своего первого романа, и он включает в себя множество слов через дефис. Вам необходимо объединить слова, поставленные через дефис, заменив обычный дефис неразрывным дефисом. Вы начинаете заменять символ вручную, но через несколько попыток останавливаетесь. Вы знаете, что должен быть более простой способ. Есть! Просто используйте функцию «Найти и заменить», чтобы сделать всю работу за вас.
Коллега ушел в отставку, а вам поручили отредактировать отчет, над которым коллега работал до своего ухода. Отчет хорошо написан, но непоследовательный интервал между абзацами. После нажатия кнопки «Показать / скрыть» вы обнаружите, что в некоторых случаях вместо одного знака абзаца используются два. Один из способов исправить интервал между абзацами — нажимать клавишу Delete каждый раз, когда вы видите лишний знак абзаца. Но есть более быстрый способ — просто найдите каждое вхождение двух знаков абзаца и замените его одним знаком абзаца.
Слишком много специальных символов, чтобы подробно описать их все, но давайте рассмотрим несколько общих примеров того, как работает поиск и замена этих символов.
Пример первый: замена текста специальным символом
Допустим, ваш документ выглядит примерно так:
Примечание. Если вы не видите специальные символы в документе, вы можете включить их, нажав кнопку «Показать / скрыть» на ленте. Его значок выглядит как символ абзаца.
Вам необходимо заменить каждое вхождение слова «Раздел» символом раздела. Перейдите на вкладку «Главная» на ленте Word и нажмите «Заменить». Или вы можете нажать Ctrl + H.
Введите слово «Раздел» в поле «Найти», а затем нажмите кнопку «Еще >>», чтобы развернуть параметры поиска и замены.
Щелкните поле «Заменить на», чтобы поместить туда точку вставки, а затем нажмите кнопку «Специальный».
В раскрывающемся списке выберите «Символ раздела».
Обратите внимание, что поле «Заменить на» теперь содержит текст «^%» — это код Word для этого символа раздела. Нажмите кнопку «Заменить все». В этом примере было произведено 16 замен. Нажмите кнопку «ОК» и закройте окно «Найти и заменить».
Все вхождения слова «Раздел» теперь заменены символом раздела.
Пример второй: замена обычного дефиса неразрывным дефисом
В следующем примере обратите внимание, что в нашем примере абзаца довольно много слов с переносом, включая три случая, когда слова с переносом разделены на разных строках. Давайте заменим все обычные дефисы неразрывными, чтобы этого не произошло.
На вкладке «Главная» нажмите «Заменить» или просто нажмите Ctrl + H.
В поле «Найти» удалите любой существующий текст или символы, а затем введите один символ дефиса. При необходимости нажмите кнопку «Еще >>», чтобы развернуть параметры «Найти» и «Заменить».
Щелкните поле «Заменить на», чтобы поместить туда точку вставки. Удалите любой существующий текст или символы, а затем нажмите кнопку «Специальные».
В раскрывающемся списке выберите «Неразрывный дефис».
Обратите внимание, что код Word для неразрывного дефиса — «^ ~» — теперь добавлен в поле «Заменить на». Нажмите кнопку «Заменить все». В этом примере было произведено 11 замен. Нажмите кнопку «ОК» и закройте окно «Найти и заменить».
Word заменил все дефисы неразрывными дефисами. Обратите внимание, что слова через дефис на правом поле больше не разделены.
Пример третий: замена двух знаков абзаца на один знак абзаца
В этом примере мы хотим заменить любые двойные знаки абзаца одним знаком абзаца, удалив лишний интервал между абзацами.
На вкладке «Главная» нажмите кнопку «Заменить». Или вы можете нажать Ctrl + H.
Щелкните поле «Найти» и удалите любой существующий текст или символы. Нажмите кнопку «Дополнительно >>», чтобы открыть дополнительные параметры, нажмите кнопку «Особые», а затем выберите параметр «Отметка абзаца» в раскрывающемся списке.
Обратите внимание, что код Word для знака абзаца («^ v») был вставлен в поле «Найти». Нажмите кнопку «Специальный» еще раз, а затем снова нажмите «Метка абзаца» в раскрывающемся списке, чтобы разместить там второй знак абзаца. (Обратите внимание, что вы также можете просто ввести «^ v ^ v» в поле, если вы уже знакомы с кодами.)
Теперь в поле «Найти» есть два знака абзаца. Щелкните поле «Заменить на», удалите любой существующий текст или символы, а затем нажмите кнопку «Специальные». В раскрывающемся меню выберите «Знак абзаца».
На последнем шаге нажмите кнопку «Заменить все». В этом примере Word произвел восемь замен. Нажмите кнопку «ОК» и закройте окно «Найти и заменить».
Все вхождения двух знаков абзаца заменены одним знаком абзаца.
Как видите, использование функции «Найти и заменить» может сэкономить много времени при замене специальных символов в документах. И мы здесь лишь коснулись поверхности. В этом меню вас ждут и другие специальные символы.