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)