Поиск…


Вступление

Шаблоны регулярных выражений часто используются с модификаторами (также называемыми флагами ), которые переопределяют поведение регулярных выражений. Модификаторы регулярных выражений могут быть регулярными (например, /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)



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow