Regular Expressions
Модификаторы регулярных выражений (флаги)
Поиск…
Вступление
Шаблоны регулярных выражений часто используются с модификаторами (также называемыми флагами ), которые переопределяют поведение регулярных выражений. Модификаторы регулярных выражений могут быть регулярными (например, /abc/i ) и встроенными (или встроенными ) (например, (?i)abc ). Наиболее распространенными модификаторами являются глобальные, нечувствительные к регистру, многострочные и точечные модификаторы. Тем не менее, ароматы регулярных выражений отличаются количеством поддерживаемых модификаторов regex и их типов.
замечания
Модификаторы PCRE
| Модификатор | В соответствии | Описание |
|---|---|---|
| PCRE_CASELESS | (?я) | Нечувствительность к регистру |
| PCRE_MULTILINE | (? М) | Совпадение нескольких строк |
| PCRE_DOTALL | (? S) | . соответствует новым строкам |
| PCRE_ANCHORED | (? А) | Мета-символ ^ соответствует только в начале |
| PCRE_EXTENDED | (?Икс) | Белые пробелы игнорируются |
| PCRE_DOLLAR_ENDONLY | н / | Мета-символ $ соответствует только в конце |
| PCRE_EXTRA | (?ИКС) | Строгий разбор партирования |
| PCRE_UTF8 | Обрабатывает символы UTF-8 | |
| PCRE_UTF16 | Обрабатывает символы UTF-16 | |
| PCRE_UTF32 | Обрабатывает символы UTF-32 | |
| PCRE_UNGREEDY | (? U) | Устанавливает движок на ленивое совпадение |
| PCRE_NO_AUTO_CAPTURE | (? :) | Отключает группы автозахвата |
Модификаторы Java
Модификатор ( Pattern.### ) | Значение | Описание |
|---|---|---|
| UNIX_LINES | 1 | Включает режим линий Unix . |
| БЕЗ УЧЕТА РЕГИСТРА | 2 | Включает совпадение без учета регистра. |
| КОММЕНТАРИИ | 4 | Разрешает пробелы и комментарии в шаблоне. |
| MULTILINE | 8 | Включает многострочный режим. |
| LITERAL | 16 | Включает литеральный синтаксический анализ шаблона. |
| DOTALL | 32 | Включает режим dotall. |
| UNICODE_CASE | 64 | Включает свертывание флагов Unicode. |
| CANON_EQ | 128 | Включает каноническую эквивалентность. |
| UNICODE_CHARACTER_CLASS | 256 | Включает Unicode версию предопределенных классов символов и классов символов POSIX. |
Модификатор DOTALL
Шаблон регулярного выражения, в котором модификатор DOTALL (в большинстве выражений regex, выраженный с помощью s ), изменяет поведение . позволяя ему соответствовать символу новой строки (LF):
/cat (.*?) dog/s
Это регулярное выражение в стиле Perl будет соответствовать строке, такой как "cat fled from\na dog" захватив "fled from\na" в группу 1.
Встроенная версия: (?s) (например, (?s)cat (.*?) dog )
Примечание . В Ruby эквивалент модификатора DOTALL - m , модификатор Regexp::MULTILINE (например, /a.*b/m ).
Примечание . JavaScript не предоставляет модификатор DOTALL, поэтому a . никогда не может быть разрешено соответствовать символу новой строки. Для достижения такого же эффекта необходимо обходное решение, например, заменяя все . s с классом символов catch-all, подобным [\S\s] , или классом символов « ничего » [^] (однако эта конструкция будет рассматриваться как ошибка всеми другими двигателями и, следовательно, не переносима).
Модификатор MULTILINE
Другим примером является модификатор MULTILINE (обычно выражается флагом m (не в Oniguruma (например, Ruby), который использует m для обозначения модификатора DOTALL)), который делает привязки ^ и $ совпадающими с началом и концом строки , а не с началом / концом всей строки.
/^My Line \d+$/gm
найдут все строки, которые начинаются с My Line , а затем содержат пробел и 1 + цифры до конца строки.
Встроенная версия: (?m) (например, (?m)^My Line \d+$ )
ПРИМЕЧАНИЕ . В Oniguruma (например, в Ruby), а также практически в любых текстовых редакторах, поддерживающих регулярные выражения, якоря ^ и $ обозначают позиции начала и окончания строки по умолчанию . Вам нужно использовать \A для определения всего начала документа / строки и \z для обозначения конца документа / строки. Разница между \Z и \z заключается в том, что первая может соответствовать перед последним символом новой строки (LF) в конце строки (например, /\Astring\Z/ найдет совпадение в "string\n" ) (за исключением Python, где поведение \Z равно \z и \z якорь не поддерживается).
Модификатор IGNORE CASE
Общим модификатором для игнорирования является i :
/fog/i
будет соответствовать Fog , foG и т. д.
Встроенная версия модификатора выглядит как (?i) .
Заметки:
В Java по умолчанию нечувствительность к регистру предполагает, что только символы в кодировке US-ASCII сопоставляются. CASE_INSENSITIVE регистра Unicode может быть активирована путем указания флага UNICODE_CASE в сочетании с этим ( CASE_INSENSITIVE ) . (например, Pattern p = Pattern.compile("YOUR_REGEX", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); ). Некоторые из них можно найти в случае нечувствительности к регистру в Java RegEx . Кроме того, UNICODE_CHARACTER_CLASS может использоваться для обеспечения соответствия Unicode.
VERBOSE / COMMENT / IgnorePatternWhitespace-модификатор
Модификатор, который позволяет использовать пробелы внутри некоторых частей шаблона для его форматирования для лучшей читаемости и для комментариев, начинающихся с # :
/(?x)^ # start of string
(?=\D*\d) # the string should contain at least 1 digit
(?!\d+$) # the string cannot consist of digits only
\# # the string starts with a hash symbol
[a-zA-Z0-9]+ # the string should have 1 or more alphanumeric symbols
$ # end of string
/
Пример строки: #word1here . Обратите внимание, что символ # экранирован, чтобы обозначить литерал # который является частью шаблона.
Невыбежденное пустое пространство в шаблоне регулярных выражений игнорируется, избегайте его, чтобы сделать его частью шаблона.
Обычно пробелы внутри классов символов ( [...] ) рассматриваются как буквальные пробелы, за исключением Java.
Кроме того, стоит упомянуть, что в PCRE, .NET, Python, Ruby Oniguruma, ICU, Boost regex flavors можно использовать (?#:...) комментарии внутри шаблона регулярного выражения.
Явный модификатор Capture
Это специальный модификатор .NET regex, выраженный с помощью n . При использовании неназванные группы (например, (\d+) ) не записываются. Только допустимые записи являются явно названными группами (например, (?<name> subexpression) ).
(?n)(\d+)-(\w+)-(?<id>\w+)
будет соответствовать целому 123-1_abc-00098 , но (\d+) и (\w+) не будут создавать группы в результирующем объекте совпадения. Единственная группа будет ${id} . См. Демонстрацию .
Модификатор UNICODE
Модификатор UNICODE, обычно выражаемый как u (PHP, Python) или U (Java), заставляет движок regex обрабатывать шаблон и строку ввода как строки и шаблоны Unicode, создавать классы сокращенного типа, такие как \w , \d , \s и т. д. Unicode-aware.
/\A\p{L}+\z/u
является регулярным выражением PHP для соответствия строкам, состоящим из 1 или более букв Unicode. См. Демо-версию regex .
Обратите внимание, что в PHP модификатор /u позволяет механизму PCRE обрабатывать строки как строки UTF8 (путем включения глагола PCRE_UTF8 ) и создавать классы сокращенного символа в шаблоне, поддерживающем Unicode (путем включения глагола PCRE_UCP , см. Подробнее на pcre.org ) ,
Строка и предметные строки рассматриваются как UTF-8. Этот модификатор доступен с PHP 4.1.0 или выше в Unix и с PHP 4.2.3 на win32. UTF-8 справедливость шаблона и объекта проверяется с PHP 4.3.5. Недействительный объект приведет к тому, что функция preg_ * не будет соответствовать ничему; недопустимый шаблон вызовет ошибку уровня E_WARNING. Пять и шесть октетных последовательностей UTF-8 считаются недействительными с PHP 5.3.4 (соответственно PCRE 7.3 2007-08-28); ранее они считались действительными UTF-8.
В Python 2.x re.UNICODE влияет только на сам шаблон: Make \w , \W , \b , \B , \d , \D , \s и \S зависимости от базы данных свойств символов Unicode.
Встроенная версия: (?u) в Python, (?U) в Java. Например:
print(re.findall(ur"(?u)\w+", u"Dąb")) # [u'D\u0105b']
print(re.findall(r"\w+", u"Dąb")) # [u'D', u'b']
System.out.println("Dąb".matches("(?U)\\w+")); // true
System.out.println("Dąb".matches("\\w+")); // false
Модификатор PCRE_DOLLAR_ENDONLY
PCRE-совместимый модификатор PCRE_DOLLAR_ENDONLY , который делает привязку $ anchor в самом конце строки (исключая позицию перед окончательной новой строкой в строке).
/^\d+$/D
равно
/^\d+\z/
и соответствует целой строке, которая состоит из 1 или более цифр и не будет соответствовать "123\n" , но будет соответствовать "123" .
Модификатор PCRE_ANCHORED
Другой модификатор, совместимый с PCRE, выраженный модификатором /A Если этот модификатор установлен, шаблон вынужден быть «привязан», то есть он должен соответствовать только в начале искомой строки («строка субъекта»). Этот эффект также может быть достигнут с помощью соответствующих конструкций в самом шаблоне, что является единственным способом сделать это в Perl.
/man/A
такой же как
/^man/
Модификатор PCRE_UNGREEDY
Соответствующий PCRE флаг PCRE_UNGREEDY, выраженный с помощью /U Он переключает жадность внутри шаблона: /a.*?b/U = /a.*b/ и наоборот.
Модификатор PCRE_INFO_JCHANGED
Еще один модификатор PCRE, который позволяет использовать дубликаты названных групп.
ПРИМЕЧАНИЕ . Поддерживается только встроенная версия - (?J) и должна быть размещена в начале шаблона.
Если вы используете
/(?J)\w+-(?:new-(?<val>\w+)|\d+-empty-(?<val>[^-]+)-collection)/
значения группы «val» никогда не будут пустыми (всегда будут установлены). Аналогичный эффект может быть достигнут при сбросе ветвей.
Модификатор PCRE_EXTRA
Модификатор PCRE, вызывающий ошибку, если за обратным слэшем в шаблоне следует письмо, которое не имеет особого значения. По умолчанию обратная косая черта, сопровождаемая буквой без специального значения, рассматривается как литерал.
Например
/big\y/
будет соответствовать bigy , но
/big\y/X
будет выдавать исключение.
Встроенная версия: (?X)