Поиск…


Литералы необработанных строк

Это лучше всего для удобства чтения (и вашего здравомыслия), чтобы избежать утечки. Вот здесь и появляются литералы строк. (Обратите внимание, что некоторые языки допускают разделители, которые обычно предпочтительнее строк. Но это еще один раздел.)

Они обычно работают так же, как описывает этот ответ :

[A] обратная косая черта, \ , воспринимается как означающая «просто обратная косая черта» (за исключением случаев, когда это происходит прямо перед цитатой, которая в противном случае завершала бы литерал) - нет «escape-последовательностей» для представления новых строк, вкладок, обратных пространств, форм-каналов , и так далее.

Не все языки имеют их, а те, которые используют различный синтаксис. C # фактически называет их стенографическими строками , но это то же самое.


питон

pattern = r"regex"
pattern = r'regex'

C ++ (11+)

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

pattern = R"delimiter(regex)delimiter";

VB.NET

Просто используйте обычную строку. Обратные косые черты ВСЕГДА литералы .

C #

pattern = @"regex";

Обратите внимание, что этот синтаксис также позволяет "" (две двойные кавычки) в качестве экранированной формы " .

Струны

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

К сожалению, любая обратная косая черта, требуемая регулярным выражением, должна быть буквальной обратной косой чертой. Вот почему возникает необходимость «избежать экранов» ( \\ ), когда регулярные выражения генерируются из строковых литералов.

Кроме того, кавычки ( " или ' ) в строковом литерале могут быть экранированы, в зависимости от того, что окружает строковый литерал. На некоторых языках можно использовать либо стиль кавычек для строки (выберите наиболее читаемый для избегая всего строкового литерала).

На некоторых языках (например: Java <= 7) регулярные выражения не могут быть выражены непосредственно как литералы, такие как /\w/ ; они должны быть сгенерированы из строк, и обычно используются строковые литералы - в этом случае "\\w" . В этих случаях буквальные символы, такие как кавычки, обратные косые черты и т. Д., Должны быть экранированы. Самый простой способ сделать это можно с помощью инструмента (например, RegexPlanet ). Этот конкретный инструмент предназначен для Java, но он будет работать для любого языка с аналогичным строковым синтаксисом.

Какие символы нужно избегать?

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

Обратные косые

Говорить, что обратная косая черта - символ «побега», немного вводит в заблуждение. Искажения обратной косой черты и обратная косая черта приходят; он фактически переключает или выключает метасимвол или буквенный статус персонажа перед ним.

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

Escaping (внешние классы символов)

Существует несколько символов, которые нужно избегать, чтобы их можно было буквально (по крайней мере, вне классов char):

  • Кронштейны: []
  • Скобки: ()
  • Кудрявые фигурные скобки: {}
  • Операторы: * , + ? , |
  • Якоря: ^ , $
  • Другие: . , \
  • Чтобы использовать литерал ^ в начале или литерал $ в конце регулярного выражения, символ должен быть экранирован.
  • Некоторые ароматы используют только ^ и $ как метасимволы, когда они находятся в начале или в конце регулярного выражения соответственно. В этих ароматах не требуется дополнительного вылета. Как правило, лучше всего их избежать.

Экранирование в классах символов

  • Лучше всего избегать квадратных скобок ( [ и ] ), когда они появляются как литералы в классе char. При определенных условиях это не требуется, в зависимости от вкуса , но это наносит вред читаемости.
  • Карет, ^ , является метасимволом, когда он ставится как первый символ в классе char: [^aeiou] . В любом другом месте класса char это просто буквальный символ.
  • Символ, - , является метасимволом, если только в начале или конце символьного класса. Если первым символом в классе char является каретка ^ , то он будет литералом, если он является вторым символом в классе char.

Избежать замены

Существуют также правила экранирования в рамках замены, но ни одно из вышеприведенных правил не применяется. Единственными метасимволами являются $ и \ , по крайней мере, когда $ можно использовать для ссылки на группы захвата (например, $1 для группы 1). Чтобы использовать литерал $ , сбегите его: \$5.00 . Аналогично \ : C:\\Program Files\\ .


Исключения из BRE

Хотя ERE (расширенные регулярные выражения) отражает типичный синтаксис в стиле Perl, BRE (основные регулярные выражения) имеет существенные отличия, когда дело доходит до экранирования:

  • Существует другой сокращенный синтаксис. Все \d , \s , \w и т. Д. Исчезли. Вместо этого он имеет свой собственный синтаксис (который POSIX смущает называет «классы символов»), например [:digit:] . Эти конструкции должны быть в пределах класса символов.
  • Есть несколько метасимволов ( . , * , ^ , $ ), Которые можно использовать в обычном режиме. ВСЕ другие метасимволы должны быть экранированы иначе:

Брекеты {}

  • a{1,2} соответствует a{1,2} . Чтобы сопоставить либо a либо aa , используйте a\{1,2\}

Скобки ()

  • (ab)\1 недействительна, так как нет группы захвата 1. Чтобы исправить ее и использовать abab используйте \(ab\)\1

бэкслэш

  • Внутри классов char (которые называются выражениями скобок в POSIX) обратная косая черта не является метасимволом (и не требует экранирования). [\d] соответствует \ или d .
  • В любом месте убегайте, как обычно.

Другой

  • + и ? являются литералами. Если механизм BRE поддерживает их как метасимволы, они должны быть экранированы как \? и \+ .

/ Разделители /

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

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

Чрезмерное избежание удобочитаемости, поэтому важно рассмотреть доступные варианты:

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

Perl 1

Perl, например, позволяет почти что-либо быть ограничителем. Даже арабские символы:

$str =~ m ش ش

Конкретные правила упоминаются в документации Perl .

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

  • Соответствующие разделители !"#$%&'*+,./:;=?@^_`|~-
  • Разделители в стиле скобок: () , {} , [] , <>


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