Дополнение №2


Регулярные выражения.



Дополнение для команд и параметров, которые используют регулярные выражения.

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

Регулярные выражения составляются из одного или более простых спецификаторов. Если символа нет в следующей таблице, значит, он соответствует только самому себе.

Символы повтора (*, +, ?, {...} ) будут соответствовать строке наибольшей длины, если сразу же за ними не идёт символ вопросительный знак '?' (в этом случае часть шаблона будет соответствовать строке наименьшей длины).

Обратный слеш - имеет несколько применений:
  1) экранирующий символ для метасимволов: \\, \., \[, \], \{, \}, \*, ....
  2) позволяет использовать непечатные символы в описании шаблона: \040, \0113, \377, \x{50}, \x50, ....
  3) указание общего типа символов: \d, \D, \w, \W, ....
  4) указание границ слова/текста: \A, \z, \Z, \b, ....
  5) указание ссылки на найденную/ые группу/ы в самом шаблоне и в шаблоне замены.

Осторожно: неправильно написанное регулярное выражение может стать причиной зацикливания и даже вызвать сбой работы утилиты.

Дополнительные ссылки:
1. Perl совместимые регулярные выражения – PCRE
2. Regular expression (Autoit help eng.)
3. Regular expression

    Метасимволы вне квадратных скобок

( )начало и конец группы, например (text). Скобки означают последовательность, используются для применения квантификаторов не к одному символу, а к нескольким, а также для дальнейшего использования найденной последовательности.
[ ]начало и конец описания символьного класса, например: [a-z], [abcЭЮЯ]. Символьный класс возвращает один символ из множества. Изменить это могут повторители.
{ } начало и конец повторителей, например:
  a{8,} - повтор предыдущего символа "a" от 8 символов и более.
  [abc]{8,} - повтор предыдущих символов от 8 символов и более.
  (xyz){3,8} - повтор предыдущей группы от 3-х до 8-ми символов.
\экранирующий символ, позволяет применять метасимвол как обычный символ, например (\\, \., \[, \], \{, \}, \*)
^начало строки (или начало текста в многострочных текстах), например ^text text$
$конец строки (или конец текста в многострочных текстах), например ^text text$
.любой символ, кроме переноса строки @LF (по умолчанию). При использовании флага (?s) - любой символ
|символ "или", обычно внутри группы, например:
  (10|20) - или "10" или "20"
  (abcd|cdfe) - или "abcd" или "cdfe"
?предыдущий символ либо имеется, либо не имеется, аналогично и для групп. После символа повтора - жадность шаблона - (.*?)
*повтор предыдущего символа или группы 0 и более раз
+повтор предыдущего символа или группы 1 и более раз

    Метасимволы внутри квадратных скобок

  Часть шаблона, заключенная в квадратные скобки, называется символьным классом.
  Внутри скобок метасимволы теряют свое специальное значение, кроме метасимволов, принадлежащих этому классу.
  Экранировать требуется только 4 символа "\", "-", "[", "]".
  Если символ "-" находится в конце перечисления, то не требует экранирования.
  В шаблоне могут использоваться метасимволы диапазонов, но не используются метасимволы границ, например \A, \B, \Z, \z, а метасимвол \b означает символ возврата 'backspace'.
  Учтите, что диапазоны, например [а-я] используют UTF-8 последовательность, а не ASCII.

\экранирующий символ, позволяет применять метасимвол как обычный символ, например (\\, \., \[, \], \{, \}, \*)
^символ исключения символьного класса, в том случае, когда стоит первым, например:
  [^3] (все символы, кроме цифры три)
  [^abc] (все символы, кроме символов "a", "b", "c")
-символ охвата (означает символьный интервал), например:
  [a-z] (то есть любой из символов от "a" до "z")
  [a-dx-z] (то есть любой из символов от "a" до "d" и от "x" до "z")
[ ]начало и конец описания символьного класса, например:
  [ahkpuЯЮЦ]
  (?i)[a-zА-ЯёЁ]

    Метасимволы подстановки

\1 - \9ссылка на найденную группу в самом шаблоне и в шаблоне замены.
  отсчёт групп слева по открывающей скобке "("
$1 - $9ссылка на найденную группу в шаблоне замены (9 не ограничение)
${1} - ${9}ссылка на найденную группу в шаблоне замены (9 не ограничение)
  например: ${1}12\$345${2} (позволяет предотвращать пересечение цифровых данных)
$0 или \0весь шаблон поиска или все группы (9 не ограничение)
\aсимвол с десятичным ASCII-кодом 7 Chr(7) (звонок). При выводе воспроизводит звуковой сигнал. BEL (hex 07)
\cnуправляющий символ, который генерируется при нажатии комбинации клавиш Ctrl+n, где n- символ
  например: \cD соответствует Ctrl+D. \cA = \001, \cZ = \032, \cM = \r = \015
\eсимвол escape Chr(27), (hex 1B)
\fперенос страницы Chr(12), (hex 0C)
\h любой горизонтальный пробел, табуляция [ \t] - Chr(9), Chr(32), Chr(160) - эквивалентно "[\x09 \xA0]"
При включённом UCP включаются дополнительные unicode разделители
"[\x09 \xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{202F}\x{205F}\x{3000}]"
\Hлюбой символ, который не пробел или табуляция [^\h]
\Kслева от \K предшествующее совпадение, т.е. текст1\Kтекст2, найти текст2, перед которым текст1
\nсимвол переноса на новую строку @LF, Chr(10), (hex 0A)
\Nлюбой символ, который не символ переноса на новую строку [^\n] (не @LF), независимо от опции (?s)
\Q ... \Eлюбые метасимволы между \Q и \E воспринимаются как текст. Не исключайте ошибки: \QD:\Edit\1.txt\E
\rсимвол возврат каретки @CR, Chr(13) (hex 0D)
\Rлюбой из символов переноса строки. [\n\f\r\v] Chr(10), Chr(11), Chr(12), Chr(13), соответствует "(?>\r\n|\n|\r)"
\tсимвол табуляции @TAB, Chr(9), tab (hex 09)
\v вертикальная табуляция (@CR и @LF и перенос страницы) [\r\n\f] Chr(10), Chr(11), Chr(12), Chr(13) - эквивалентно "[\x0A-\x0D]"
При включённом UCP включаются дополнительные unicode разделители
"[\x0A-\x0D\x{0085}\x{2028}\x{2029}]"
\Vлюбой символ, который не Chr(10), Chr(11), Chr(12), Chr(13) вертикальная табуляция (перенос строки) [^\v]
\x**где * - любая шестнадцатеричная цифра
  например: \x41 соответствует латинской букве 'A', \x50\x65\x72\x6C - слово Perl
\x{**..}где * - любая шестнадцатеричным цифра
  например: \x{50}\x{65}\x{72}\x{6C} - слово Perl
  попробуйте от \x{01} до \x{7F}, что в десятеричной системе означает символы от 1 до 127
  или в UTF кодировке \x{044F} равный символу "я"
\***где * - любая восьмеричная цифра
  например, последовательность \120\145\162\154 представляет слово Perl
    (\120 - восьмеричный код буквы Р, \145 - буквы е, \162 - буквы r, \154 - буквы l)
  пробел - \040
  попробуйте от \001 до \177, что в десятеричной системе означает символы от 1 до 127

    Метасимволы для задания диапазонов символов

\dлюбая десятичная цифра [0-9]
\Dлюбая не цифра [^0-9]
\s пустой символ: Chr(9), Chr(10), Chr(12), Chr(13), Chr(32) (перенос страницы, табуляция, возврат каретки, перевод строки и пробел) [\f\n\r\t\v ] - эквивалентно "[\h\x0A\x0C\x0D]"
При включённом UCP "[x0C\x0D]"
\Sлюбой непробельный символ [^\f\n\r\t\v ]
\w любой алфавитно-числовой символ или подчеркивание (только символы латинского алфавита) [0-9a-zA-Z_]

При включённом UCP любой алфавитно-числовой символ Unicode или подчеркивание (включая русские символы и символы других языков)
\W любой символ неслова [^0-9a-zA-Z_]

При включённом UCP любой не алфавитно-числовой символ Unicode и подчеркивание (исключая русские символы и символы других языков)
\p{Name}
\p{^Name}

\P{Name}
\P{^Name}
Только пи включённом UCP
\p{Name} - получает символ со свойством Name, где Name - имя свойства.
\P{Name} - исключает символ со свойством Name, где Name - имя свойства.

Пример записи:

(*UCP)\p{Cyrillic}+  получает слова включающие только кириллические символы
(*UCP)\p{^Cyrillic}+  получает символы исключающие кириллические символы

(*UCP)\P{^Cyrillic}+  получает слова включающие только кириллические символы
(*UCP)\P{Cyrillic}+  получает символы исключающие кириллические символы

Языковые свойства:

{Arabic}, {Armenian}, {Avestan}, {Balinese}, {Bamum}, {Bassa_Vah}, {Batak}, {Bengali}, {Bopomofo}, {Brahmi}, {Braille}, {Buginese}, {Buhid}, {Canadian_Aboriginal}, {Carian}, {Caucasian_Albanian}, {Chakma}, {Cham}, {Cherokee}, {Common}, {Coptic}, {Cuneiform}, {Cypriot}, {Cyrillic}, {Deseret}, {Devanagari}, {Duployan}, {Egyptian_Hieroglyphs}, {Elbasan}, {Ethiopic}, {Georgian}, {Glagolitic}, {Gothic}, {Grantha}, {Greek}, {Gujarati}, {Gurmukhi}, {Han}, {Hangul}, {Hanunoo}, {Hebrew}, {Hiragana}, {Imperial_Aramaic}, {Inherited}, {Inscriptional_Pahlavi}, {Inscriptional_Parthian}, {Javanese}, {Kaithi}, {Kannada}, {Katakana}, {Kayah_Li}, {Kharoshthi}, {Khmer}, {Khojki}, {Khudawadi}, {Lao}, {Latin}, {Lepcha}, {Limbu}, {Linear_A}, {Linear_B}, {Lisu}, {Lycian}, {Lydian}, {Mahajani}, {Malayalam}, {Mandaic}, {Manichaean}, {Meetei_Mayek}, {Mende_Kikakui}, {Meroitic_Cursive}, {Meroitic_Hieroglyphs}, {Miao}, {Modi}, {Mongolian}, {Mro}, {Myanmar}, {Nabataean}, {New_Tai_Lue}, {Nko}, {Ogham}, {Ol_Chiki}, {Old_Italic}, {Old_North_Arabian}, {Old_Permic}, {Old_Persian}, {Old_South_Arabian}, {Old_Turkic}, {Oriya}, {Osmanya}, {Pahawh_Hmong}, {Palmyrene}, {Pau_Cin_Hau}, {Phags_Pa}, {Phoenician}, {Psalter_Pahlavi}, {Rejang}, {Runic}, {Samaritan}, {Saurashtra}, {Sharada}, {Shavian}, {Siddham}, {Sinhala}, {Sora_Sompeng}, {Sundanese}, {Syloti_Nagri}, {Syriac}, {Tagalog}, {Tagbanwa}, {Tai_Le}, {Tai_Tham}, {Tai_Viet}, {Takri}, {Tamil}, {Telugu}, {Thaana}, {Thai}, {Tibetan}, {Tifinagh}, {Tirhuta}, {Ugaritic}, {Vai}, {Warang_Citi}, {Yi}

Различные свойства категорий:
Те свойства, которые не совсем понятны пока отмечены *
Некоторые свойства групп можно посмотреть в "Таблице символов" (charmap.exe) в группировке "Диапазоны Юникода"

СвойствоОписание
   Управляющие символы
\p{C}Невидимые управляющие символы и неиспользуемые позиции:
        ﹓ ۝ ­   ‎꒍꒎꒏᠎཈  и др.
\p{Cc}Контрольные: ASCII или Latin-1 управляющие символы: 0x00-0x1F и 0x7F-0x9F
\p{Cf}Невидимые индикаторы форматирования:
۝­‎᠎
\p{Co}Любые позиции, зарезервированные для личного использования, типа U+E801 (59393):

\p{Cs}Суррогатные, символы в диапазоне от U+D800 до U+DFFF - половина суррогатных пар в кодировке UTF-16
\p{Cn}Неназначенные в таблице символов, типа U+FE53 (65107) - любые позиции, у которых не назначены символы
   Буквы
\p{L}Любые буквы любого языка
\p{Ll}Буквы нижнего регистра (строчные) из тех, что имеют прописной вариант написания
\p{Lm}Модификаторы буквы: специальные символы, которые используются как буквы
\p{Lo}Буквы не входящие начальный диапазон: символ или идеограмма, которая не имеет прописных и строчных вариантов написания
\p{Lt}Заглавное письменные: прописная буква, которая появляется с начала слова из строчных букв
\p{Lu}Буквы верхнего регистра (прописные) для тех, что имеют строчный вариант написания
\p{L&}Буква, которая имеет как прописной, так и строчный варианты написания
   Специальные символы
\p{M}Символы, вставленные для комбинирования с другими символами (например акценты, умляуты, оборачивающие скобки):
ைொோௌ்ௗᦰᦱᦲᦳᦴᦵᦶᦷᦸᦹᦺᦻᦼᦽᦾᦿᧀᧈᧉ〪߲〭〮〯〫߫߬߭߮߯߰߱߳〬 и др.
\p{Mc}Символы, вставленные для комбинирования с другими символами, занимая дополнительную ширину (как во многих восточных языках)
\p{Me}Символы, которые оборачивают символ. Например круг, квадрат и т.п
\p{Mn}Символ, вставленный для комбинирования с другими символами, не занимая дополнительной ширины
   Цифровые символы
\p{N}Любые виды цифровых символов в любых языках:
0123456789 ²³⅓⅔⅛⅜⅝⅞¹¼½¾ 0123456789 ๐๑๒๓๔๕๖๗๘๙໐໑໒໓໔໕໖໗໘໙ ۷۲٠١٢٣٤۴٥۵٦٧٨٩ ⅕⅖⅗⅘⅙⅚⅟ ❶❷❸❹❺❻❼❽❾❿ ➀➁➂➃➄➅➆➇➈➉ ➊➋➌➍➎➏➐➑➒➓ ㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿ ௦௧௨௩௪௫௬௭௮௯௰௱௲ ᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩ ፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼ ᛮᛯᛰ߀߁߂߃߄߅߆߇߈߉ 〇〡〢〣〤〥〦〧〨〩 ㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉ ០១២៣៤៥៦៧៨៩ ៰៱៲៳៴៵៶៷៸៹ ᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙ ༠༡༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳  и др.
\p{Nd}Десятичное число: цифры от нуля до девятки в любых языках:
0123456789 |  0123456789 |  ๐๑๒๓๔๕๖๗๘๙ |  ໐໑໒໓໔໕໖໗໘໙ |  ۷۲٠١٢٣٤۴٥۵٦٧٨٩ |  ௦௧௨௩௪௫௬௭௮௯ |  ᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙ |  ꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩ |  ߀߁߂߃߄߅߆߇߈߉ |  ០១២៣៤៥៦៧៨៩ |  ᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙ |  ༠༡༢༣༤༥༦༧༨༩ и др.
\p{Nl}Число, которое может выглядеть как буквы, например как римские числа *:
ᛮᛯᛰ〇〡〢〣〤〥〦〧〨〩
\p{No}Число, представленное как верхний или нижний индекс, или число, которое не состоит из цифр (исключая числа из идеографических письменностей):
²³⅓⅔⅛⅜⅝⅞¹¼½¾⅕⅖⅗⅘⅙⅚⅟❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿௰௱௲፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉៰៱៲៳៴៵៶៷៸៹༪༫༬༭༮༯༰༱༲༳
   Знаки пунктуации
\p{P}Любой вид пунктуационных знаков:
;.,:(-)@/"*_{}[]#'!%&\†‡”…“•§„«»¶·’‛‚‘‹‾›‗―[\]_{}⦅⦆@。「」、・︐︑︒︓︔︕︖︗︘︙︰︱︲︳︴︵︶︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹅﹆﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟﹠﹡﹣﹨﹪﹫!"#%&'()*,-./:;?–—෴?¿؟‰※″′‼¡·๏๚๛׳״،؛჻՚՛՜՝՞՟־׀׃׆։֊꘍꘎꘏꡴꡵꡶꡷፠፡።፣፤፥፦፧፨᙭᙮᚛᚜᛫᛬᛭߷߸߹、。〃〈〉《》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〽﴾﴿។៕៖៘៙៚᠀᠁᠂᠃᠄᠅᠆᠇᠈᠉᠊༄༅༆༇༈༉༊་༌།༎༏༐༑༒༔༺༻༼༽྅ и др.
\p{Pd}Любой вид дефисов или тире:
-―︱︲﹘﹣-–—־֊〜〰᠆ и др.
\p{Ps}Любой вид открывающих скобок:
({[([„‚[{⦅「︗︵︷︹︻︽︿﹁﹃﹙﹛﹝(᚛〈《「『【〔〖〘〚〝﴿༺༼ и др.
\p{Pe}Любой вид закрывающих скобок:
)}]]}⦆」︘︶︸︺︼︾﹀﹂﹄﹚﹜﹞)᚜〉》」』】〕〗〙〛〞〟﴾༻༽ и др.
\p{Pi}любой вид открывающих кавычек:
“«‛‘‹ и др.
\p{Pf}Любой вид закрывающих кавычек:
”»’› и др.
\p{Pc}Пунктуационные символы/соединители, такие как знаки подчёркивания или соединения слов:
_____︳︴﹍﹎﹏ и др.
\p{Po}Любые виды пунктуационных символов, что не являются точками, скобками, кавычками или соединителями:
;.,:@/"*#'!%&\†‡…•§¶·‾‗\@。、・︐︑︒︓︔︕︖︙︰﹅﹆﹉﹊﹋﹌﹐﹑﹒﹔﹕﹖﹗﹟﹠﹡﹨﹪﹫!"#%&'*,./:;?෴?¿؟‰※″′‼¡·๏๚๛׳״،؛჻՚՛՜՝՞՟׀׃׆։꘍꘎꘏꡴꡵꡶꡷፠፡።፣፤፥፦፧፨᙭᙮᛫᛬᛭߷߸߹、。〃〽។៕៖៘៙៚᠀᠁᠂᠃᠄᠅᠇᠈᠉᠊༄༅༆༇༈༉༊་༌།༎༏༐༑༒༔྅ и др.
   Математические символы
\p{S}Математические символы, символы валюты, символы псевдографики (рамки) и т. п.
=\s±~`^><|°©®™ и др.
\p{Sc}Любые символы валют
$¤﹩$¢£₽¥₩₣₤¥£€₪₧₫฿௹៛¢ и др.
\p{Sk}Символ модификатора: комбинированный символ (пометка) как комбинация самого символа и символа отметки
`^¨῭΅`῝῞῟῁῀᾿᾽῍῎῏῾^` ̄꜠꜡꞉꞊ и др.
\p{Sm}Любые математические символы
=+±~><|♯¬∙⁄|~﹢﹤﹥﹦+<=>¬←↑→↓←↑→↓↔∂∆∏∑∞∟∩≈√∫≠≡⌠⌡≤≥÷϶⇒⇔∀∃∇∈∋−∕∝∠∥∧∨∪∬∮∴∵∽≒≦≧≪≫⊂⊃⊆⊇⊿ и др.
\p{So}Различные символы, не математические, не символы валют или их комбинации
°©®™۩┬┌┴┘└┤├┐─═┼╧╖║╡╚╝╘╟╤╣╗╪╦╔╠│╫╙╓╢╒╥╩╜╛╕╞╬╨┏┓┗┛┝┠┣┥┨┫┯┰┳┷┸┻┿╂╋□▪▫▬▲►▼◄◊○●◘◙◦☺☻☼♂♀ и др.
   Пробелы и разделители
\p{Z}Любые виды пробелов или невидимых разделителей: пробел, табуляция и др.
\p{Zl}Символ разделения в виде линии 
 (U+2028)
\p{Zp}Знак параграфа 
 (U+2029)
\p{Zs}Пробельные символы, которые невидимы, но имеют ширину


    Границы символов

\Aначало текста, не зависит от флага "(?m)" и поэтому может встретится только 1 раз
\Gобозначает точку, в которой закончился предыдущий поиск (first matching position in subject)
похожий на \A, но несколько раз, если найденные следуют друг за другом от начала
\zабсолютный конец текста, не зависит от флага "(?m)" и поэтому может встретится только 1 раз
\Zконец текста, т. е. граница между любым символом и концом текста или до символа \n, если он в конце строки, не зависит от флага "(?m)" и поэтому может встретится только 1 раз.
\bначало или конец слова, т. е. граница между символами, один из которых удовлетворяет \W, а другой - удовлетворяет \w (только границы слов латинского алфавита)
При включённом UCP границы \b работают для слов Unicode, т.к. \w и \W захватывают символы Unicode.
\Bсередина слова, т. е. граница между символами, оба которых удовлетворяют \W или оба которых удовлетворяют \w
При включённом UCP серединой слова являются и слова с Unicode символами.

    Флаги модификаторы

  Ставятся в начало регулярного выражения или группы.
  Состояние модификаторов выключено по умолчанию, соответственно для использования требуется включить.
  Пример использования: (?i)(Text) или ((?-i)Text), допустимо комбинировать (?is)(Text) или ((?imsx)Text)

(?i)не учитывать регистр символов.
(?-i)отменяет ранее включенный (?i)
(?m)многострочный поиск.
  во многострочном тексте символы ^ и $ означают начало и конец строки соответственно, иначе начало и конец текста
(?-m)отменяет ранее включенный (?m)
(?s)точке соответствует любой символ.
  символ "точка" (.) дополнительно включает в себя перенос строки @LF (режим "одна строка")
(?-s)отменяет ранее включенный (?s)
(?x)игнорирует пробелы и табуляции в регулярном выражении, кроме тех что в квадратных скобках.
  пробелы позволяют сделать регулярное выражение легко читаемым.
  позволяет в конце регулярного выражения добавить комментарий после символа # и до конца строки
(?-x)отменяет ранее включенный (?x)
(?J)allow duplicate names (разрешает дубликаты/двойные названия).
  подшаблоны могут иметь одинаковые имена
(?U)инвертировать жадность квантификаторов.
  кванторы становятся ленивыми (не жадными)
(?-U)отменяет ранее включенный (?U)

    Флаги групп

Допустимо комбинировать, например (?im-sx:Text), флаги sx выключены

(?i:...)группа не учитывает регистр символов, например (?i:Text)
  это работает только для символов латинского алфавита.
(?-i:...)группа учитывает регистр символов, например: (?-i:Text)
(?:...)исключает группу из найденных, например: (?:Text)
(?>...)группа не входящая в поиск, но имеет свойство сверхжадного квантификатора, например: (?>Text)(Text)
(?=...)группа не входящая в поиск, но проверяющая совпадение образца справа, например: (Text)(?=Text)
(?!...)группа не входящая в поиск, но проверяющая не совпадение образца справа, например: (Text)(?!Text)
  Следующие 2 группы имеют фиксированную длину, в них нельзя использовать *, +, {n, m}
(?<=...)группа не входящая в поиск, но проверяющая совпадение образца слева, например: (?<=Text)(Text), см. также \K
(?<!...)группа не входящая в поиск, но проверяющая не совпадение образца слева, например: (?<!Text)(Text)
  Дополнительные группы
(?<name>...)именованная ссылка.
  вызов именованной ссылки \k<name> это тоже что вызов \1 или $1
(?#...)группа содержащая комментарий
  например: (?# это комментарий ) (полностью игнорируется интерпретатором)
(?|...)группа без захвата со сбросом

    Повтор предыдущего элемента, применяется к символам и группам (квантификаторы)

{n}повторить предыдущий символ n раз.
  может иметь ограничения, к примеру, (?s)\A(.{65536}) или (?s)\A((?:..){10921})
{n,}повторить предыдущий символ n и более раз ( {n,}? - предпочтительно наименьший захват)
{n, m}повторить предыдущий символ от n до m раз ( {n,m}? - предпочтительно наименьший захват)
*повторить предыдущий символ 0 и более раз. То же что и {0,}
  жадный захват, наибольший, который позволит совпасть оставшейся части шаблона.
+повторить предыдущий символ 1 и более раз. То же что и {1,}
  жадный захват, наибольший, который позволит совпасть оставшейся части шаблона.
?предыдущий символ либо имеется, либо не имеется. То же что и {0,1}
  второе значение символа ? после символа повтора .*? - жадность, см. ниже
*?повторить предыдущий символ 0 и более раз
  ограничится наименьшим захватом (не жадный), который позволит совпасть оставшейся части шаблона.
+?повторить предыдущий символ 1 и более раз
  ограничится наименьшим захватом (не жадный), который позволит совпасть оставшейся части шаблона.
??предпочтительно наименьший захват, например: ([a-z]??)g для 'gg' возвращает две пустые строки

    Ревнивая или сверхжадная квантификация

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

*+повторить предыдущий символ 0 и более раз.
++повторить предыдущий символ 1 и более раз.
{n,}+повторить предыдущий символ n и более раз.

    Символьные классы POSIX

  Пример: [[:upper:]]{2} - поиск повтора заглавных букв. Инвертировать диапазон так: [^[:digit:]]
  Несколько диапазонов [[:digit:]s-z]

[:alnum:] буквы и цифры,как \w, но без "_" - эквивалентно [^\W_] или [0-9A-Za-z]
При включённом UCP буквы и цифры Unicode (такие же, как [^\W_] или \p{Xan})
[:alpha:]Буквы ASCII (такие же, как [^\W\d_] или [A-Za-z] без "_")
При включённом UCP буквы Unicode (такие же, как [^\W\d_] или \p{L})
[:ascii:]символы от Chr(0) до Chr(127)
[:blank:]пробел и символ табуляции Chr(9) и Chr(32), тоже что [\t ]
При включённом UCP горизонтальные пробелы Unicode (то же, что и \h)
[:cntrl:]управляющие символы от Chr(0) до Chr(31) и Chr(127)
[:digit:]десятичные цифры, тоже что \d, [0-9]
При включённом UCP десятичные цифры Unicode (такие же, как \d или \p{Nd})
[:graph:]тоже что символы, отображаемые при печати [:print:], но кроме пробела (от Chr(33) до Chr(126) )
[:lower:]прописные буквы [a-z]
При включённом UCP Unicode строчные буквы (такие же, как \p{Ll})
[:print:]символы, отображаемые при печати, включая пробел (от Chr(32) до Chr(126) )
[:punct:]символы, отображаемые при печати, кроме букв и цифр Chr=(33-47, 58-64, 91-96, 123-126), те, что не входят ни в [:alnum:], ни в [:cntrl:]
[:space:]пробельные символы (как \s, но включая символ VT: Chr(11) ) от Chr(9) до Chr(13) и Chr(32). Тоже что [\f\n\r\t\v ]
[:upper:]заглавные буквы [A-Z]
При включённом UCP Unicode прописные буквы (такие же, как \P{Lu})
[:word:]Символы ASCII "Word" (такие же, как \w или [[:alnum:]_]).
При включённом UCP символы Unicode "word" (такие же, как \w или [[:alnum:]_] или \p{Xwd})
[:xdigit:]шестнадцатеричные цифры [0-9A-Fa-f]

    Обратные ссылки

Обратные ссылки позволяют повторно использовать содержимое ранее захваченной группы.

\n
\1 ... \9
Ссылается на предыдущую группу захвата по ее абсолютному числу.
Предупреждение: если номер группы n не существует, он вычисляется как символ со значением n при условии, что n является допустимым восьмеричным значением, иначе происходит ошибка.
Из-за этой двусмысленности данная форма не рекомендуется.
Отдавайте предпочтение следующим формам для безопасной семантики.
\gn Ссылается на предыдущую группу захвата по ее абсолютному числу.
\g{n} Ссылается на предыдущую группу захвата по ее абсолютному числу. Аналогично приведенному выше, но четко разграничивает, где заканчивается n: полезно, когда следующий символ(ы) является(являются) цифрами.
\g-n Ссылается на предыдущую группу захвата по ее относительному номеру.
\k Ссылается на предыдущую группу захвата по ее имени.

Примеры обратных ссылок:
У круглых скобок есть еще одно замечательное свойство - они "запоминают" часть регулярного выражения.
Сослаться на запомненную часть можно с помощью конструкции \n, где n - номер запомненной части (нумерация идет слева направо и с единицы).
Так же следует учитывать, что то выражение с "или" (xxx|yyy) также сохраняется.

1. Рассмотрим пример: (\d)\d([a-z])\1\2
a) Первым символом ожидается цифра (\d). Она окружена круглыми скобками, то есть "запомнена". Так как она первая слева, то и имеет номер 1. (если в строке первая цифра 3, то будет запомнена цифра 3, если первая 1, то 1)
b) Вторым символом ожидается также цифра \d. Она не окружена скобками, то есть не участвует в запоминании и к ней нельзя обратиться.
c) Третьей символом ожидается прописная латинская буква ([a-z]). Она запомнена и запомнена под номером 2.
  Далее идет обращение к запомненным "кусочкам":
d) Четвертым символом ожидает тот же символ, что и на первой позиции \1.
e) Пятым - тот же, что на третьей \2.
  В итоге: строка "11a1a" соответствует шаблону, строка "12a1a" - тоже, а вот строка "21a1a" - не соответствует.
Если мы хотим отказаться от сохранения, то мы может поставить после открывающей скобки ?:
2. Рассмотрим пример: (?:\d)\d([a-z])\1
В этом случае строки "12aa" и "21aa" будут соответствовать шаблону, а "11ab" - нет

    Ссылки на ...

Группы захвата подпрограмм - это подшаблоны, которые могут быть вызваны (возможно, рекурсивно) точно так же, как подпрограммы в языке программирования. Подшаблон просто повторно запускается в текущей точке сопоставления.

(?R) или (?0) Рекурсирует во все регулярное выражение.
(?n) Вызывает подшаблон по абсолютному номеру.
(?+n) Вызывает подшаблон по относительному номеру.
(?-n) Вызывает подшаблон по относительному номеру.
(?&name) Вызывает подшаблон по имени.

    Условные подмаски

(?(condition)yes-pattern)например:
  (?(условие)шаблон_при_успехе)
  (?(если)то)
  (?(?=[a-z])\d)
(?(condition)yes-pattern|no-pattern)например:
  (?(условие)шаблон_при_успехе|шаблон_при_не_успехе)
  (?(если)то|иначе)
  (?(?<=\d)a|b)
  (?:(?>(?=[^a-z]*[a-z])())?(?:(?=\1)aa|(?!\1)1))
(?=[\w]+)| (?R)рекурсивный вызов
Инверсия. Получение значений, кроме заданного шаблона...
(?(?=pattern)|.+?)
или
(?(?=pattern)(*ACCEPT)|.+?)
например:
[[:upper:]] - найдёт заглавные буквы.
(?(?=[[:upper:]])|.+?) - найдёт всё, кроме заглавные букв.
если не найдено, то возвращает пустое значение.
(?(?=pattern)(*FAIL)|.+?) или
(?(?=pattern)(*F)|.+?)
например:
[[:upper:]] - найдёт заглавные буквы.
(?(?=[[:upper:]])(*FAIL)|.+?) - найдёт всё, кроме заглавные букв.
если не найдено, то (*FAIL) не возвращает пустое значение.

    Регулирование возврата

Те методы, которые не совсем понятны пока отмечены *

(*ACCEPT) Принудительно обеспечивает немедленный успех сопоставления в текущей подпрограмме или шаблоне верхнего уровня.
(*FAIL) или (*F) Приводит к немедленному сбою сопоставления.
(*MARK:name) или (*:name) *
(*COMMIT) *
(*PRUNE) *
(*PRUNE:name) *
(*SKIP) *
(*SKIP:name) *
(*THEN) *
(*THEN:name) *

    Необычные настройки и опции

Настройки пока не до конца изучены, как только появятся примеры, добавится описания применения...

(?J) Позволяет дублировать имена групп или подгрупп.
(?X) Приводит к тому, что некоторые последовательности вне контекста вызывают ошибку.
(*J) Обеспечивает совместимость с javascript.
(*LIMIT_MATCH=n) Ограничивает количество совпадений до n.
(*LIMIT_RECURSION=n) Ограничивает количество рекурсии до n.
(*NO_START_OPT) Отключает некоторые оптимизации.

    Параметры перевода строки/перевода строки

Параметр новой строки может быть изменен с помощью параметров PCRE при его запуске. Параметр новой строки также можно указать в начале шаблона, используя одно из следующих:

(*LF) Символ перевода строки - это символ перевода строки. Соответствующие переводы строк могут быть сопоставлены с \n
(*CR) Перевод строки - это возврат каретки. Соответствующие переводы строк могут быть сопоставлены с \r
(*CRLF) Возврат каретки, за которым следует перевод строки. Соответствующие переводы строк могут быть сопоставлены с \r\n
(*ANYCRLF) Любое из вышеперечисленных выражений, встречающихся в данных, вызовет обработку новой строки. Соответствующие разрывы строк могут быть сопоставлены с (?:\r\n?|\n) или с \R
(*ANY) Любое из вышеперечисленных плюс специальные переводы строк в Юникоде.
(*BSR_UNICODE)
(*BSR_ANYCRLF)
Изменяется действие параметра \R


    Unicode Category Properties (UCP)

  AutoIt использует движок PCRE. PCRE означает "Perl-совместимые регулярные выражения" и является наиболее полным доступным движком с открытым исходным кодом.
  В версии AutoIt 3.3.16.0 обновлён движок PCRE до версии 8.44.
  Эта реализация включает поддержку Unicode Category Properties (UCP), которая позволяет выполнять точную обработку большинства человеческих языков.
  Однако для поддержания совместимости с предыдущими версиями и поддержания максимальной скорости сопоставления поддержка UCP по умолчанию не включена.
  Вы можете включить его, добавив строку (*UCP) в самом начале вашего шаблона поиска (pattern).
  Если параметр UCP включен, он изменяет действие ряда элементов регулярных выражений.
  Выше в элементах указано, где это применимо и какие изменения при этом действуют.
  UCP он заставляет последовательности, такие как \w, \W, \v, \V, \h, \H и другие, использовать свойства Unicode для определения типов символов, вместо того чтобы распознавать только символы ASCII c кодами менее 128 через таблицу поиска. Они соответственно влияют на \b, \B ...
  UCP позволяет подключать специальные свойства символов: \p{Name}, \P{Name}, которые облегчают работу с Unicode последовательностями.
  В команде regex в библиотеке Library_Example есть примеры применения данной возможности.


    Ограничения в регулярном выражении.

Есть ряд ограничений в регулярных выражениях:
Опытным путём выяснено, что длина шаблона ограничена 32767 символами.
Дополнительная информация здесь


    Эти флаги не действуют в AutoIt3

\p любой символ пунктуации
\lозначает, что следующий символ регулярного выражения преобразуется в нижний регистр.
\uозначает, что следующий символ регулярного выражения преобразуется в верхний регистр.
\L...\Еозначает, что все символы в регулярном выражении между \L и \Е преобразуются в нижний регистр.
\U...\Еозначает, что все символы в регулярном выражении между \U и \Е преобразуются в верхний регистр.
\xлюбой шестнадцатеричный символ
\<начало слова, т. е. граница между символом, удовлетворяющим \W и символом, удовлетворяющим \w
\>конец слова, т. е. граница между символом, удовлетворяющим \w и символом, удовлетворяющим \W
{,n}повторить предыдущий символ от 0 до n раз

    Примеры конструкций

.*повтор любого символа, а значит весь текст
[ ... ]одиночный символ множества, например [aeiou] - любой из строчных гласных
[^ ... ]ни один из символов множества, например [^aeiou] - ни один из строчных гласных
[0-9A-Fa-f]{6}шестнадцатеричное число, например FF0000
[А-яЁё]диапазон для русских букв. Или так [А-Яа-яЁё]

Примеры
НайтиЗаменитьОписание
(\r\n|\r|\n){2,}\1удаляет пустые строки
(?<![^\s\A])([А-яЁё]+)[\h]+\1\1удаляет повторы слов
[A-ZА-ЯЁ]{2,}?[a-zа-яё]+выявляет файлы, в которых есть ошибки вида "НАйти"- не преднамеренный повтор заглавной буквы
(.{35,}?)\h'$1'&@CRLFвыполняет перенос строки на границе первого попавшегося пробела после каждых 35 символов
(*UCP)(?si)(https?://[\w.:]+/?[\w/?&:,=.~;@–\-+!*_#%()]*)найти ссылки, в которые могут входить русские символы и символы Unicode
[A-Za-z0-9._-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})найти почтовые ящики






Для изучении на практике регулярных выражений рекомендую команду regex


1. Просмотреть все примеры из библиотеки шаблонов Library_Example, но и другие тоже конечно )



2. Обратить внимание на примеры "Замены" , в ряде случаев необходимо просто нахождение строки.
Ну а далее дело в усидчивости и терпения. Тем более что изучение и понимание регулярных выражений ведёт к экономии времени в автоматизации действий.

Они есть везде, где простым поиском (заменой) сложно решить задачу одним кликом.
Они есть во многих программах и позволяют быстро отсеять ненужное, оставив необходимое:

в Total Commander - в групповом переименовании, в диалоге поиска...



в AkelPad, в текстовых редакторах...



На первый взгляд - это что-то непонятное и необъятное, на самом деле дорогу осилит идущий.

Игнорирование и не изучение регулярных выражений отбрасывает назад

Вот несколько советов:
1. Не старайтесь изучить сразу всё. Не обязательно знать все правила, чтобы использовать регулярные выражения.
2. При решении какой-либо задачи с помощью регулярных выражений:
  a) Пробуйте сами
  б) Если не получается ещё раз прочитайте соответствующую литературу
  в) Если не получается спросите
  (важен порядок изучения)
3. Изучайте на примерах. В интернете можно найти достаточно примеров.
4. Записывайте, сохраняйте "пройденные" примеры (конструкции)



Рассмотрим простой пример (задачу можно выполнить даже без регулярных выражений)

Есть строка coverAbout
Необходимо оставить только About

Пункты действий соответствуют номерам на картинке.

1. Устанавливаем радио кнопку "Замена"
2. В поле Текста вводим строку coverAbout
3. Создаём условия поиска в поле шаблона cover(About)
4. Вводим условия замены [bgcolor=red]$1[/bgcolor]
5. Нажимаем "Тест"
6. Если всё правильно, то в поле "Результаты поиска" будет результат [bgcolor=green]About[/bgcolor]
----
7. Для дополнительной справки
8. Можно сохранить шаблон






© Аверин Андрей для Total Commander Image  Averin-And@yandex.ru