Как мы можем предоставить квадратные скобки под регулярным выражением [duplicate]

Еще один способ решить эту проблему - уловить сгенерированную ошибку и не реконструировать ее:

  catch (ThreadAbortException) {}  
317
задан Mechanical snail 2 October 2011 в 09:03
поделиться

8 ответов

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

Для PCRE и большинства других так называемых Perl-совместимых ароматов избегайте этих внешних классы символов:

.^$*+?()[{\|

и эти внутренние классы символов:

^-]\

Для POSIX расширенных регулярных выражений (ERE), избегайте этих внешних классов символов (таких же, как PCRE):

.^$*+?()[{\|

Выключение любых других символов является ошибкой с POSIX ERE.

Внутри классов символов обратная косая черта является буквальным символом в регулярных выражениях POSIX. Вы не можете использовать его, чтобы избежать чего-либо. Вы должны использовать «умное размещение», если хотите включить метасимволы класса символов в виде литералов. Поместите ^ в любом месте, кроме как в начале, в начале, а в начале или в конце класса символов, чтобы соответствовать этим буквально, например:

[]^-]

В основных регулярных выражениях POSIX (BRE), это метасимволы, которые вам нужно убежать, чтобы подавить их смысл:

.^$*

Выпуски из круглых скобок и фигурных скобок в BRE дают им особый смысл, который их неописуемые версии имеют в ERE. Некоторые реализации (например, GNU) также придают особое значение другим символам при экранировании, например \? и +. Сброс символа, отличного от. ^ $ * () {}, Как правило, является ошибкой с BRE.

Внутри классов символов BRE следуют тому же правилу, что и ERE.

Если все это делает голова спина, возьмите копию RegexBuddy . На вкладке «Создать» нажмите «Вставить маркер», а затем «Литерал». RegexBuddy добавит экраны при необходимости.

302
ответ дан Jan Goyvaerts 16 August 2018 в 03:34
поделиться
  • 1
    Мне кажется, вы забыли «/», который также нужно избегать вне класса. – jackthehipster 14 January 2015 в 09:23
  • 2
    / не является метасимволом в любом из ароматов регулярного выражения, о котором я упоминал, поэтому синтаксис регулярных выражений не требует его ускорения. Когда регулярное выражение цитируется как литерал на языке программирования, тогда правила форматирования строки или регулярного выражения этого языка могут потребовать экранирования / или " или ' и могут даже потребовать `\` вдвойне сбежал. – Jan Goyvaerts 7 February 2015 в 00:39
  • 3
    как насчет двоеточия, & quot;: & quot ;? Должна ли она скрываться внутри классов персонажей, а также снаружи? ru.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions говорит, что «PCRE имеет последовательные правила экранирования: любой неабсолютно-буквенный символ может быть экранирован, чтобы обозначить его буквальное значение [...] & quot; – nicolallias 22 May 2015 в 14:05
  • 4
    Может быть экранировано не то же самое, что СЛЕДУЕТ сбежать. Синтаксис PCRE никогда не требует вытеснения буквенного двоеточия, поэтому экранирование букв colons только упрощает чтение вашего регулярного выражения. – Jan Goyvaerts 9 June 2015 в 07:52
  • 5
    Для не-POSIX ERE (тот, который я использую чаще всего, потому что это то, что реализовано Tcl), избегая других вещей, не генерирует ошибок. – slebetman 21 August 2015 в 04:47

Modern RegEx Flavors (PCRE)

Включает C, C ++, Delphi, EditPad, Java, JavaScript, Perl, PHP (preg), PostgreSQL, PowerGREP, PowerShell, Python, REALbasic, Real Studio, Ruby , TCL, VB.Net, VBScript, wxWidgets, XML Schema, Xojo, XRegExp.PCRE совместимость может различаться

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Anywhere: . ^ $ * + - ? ( ) [ ] { } \ |


Legacy RegEx Flavors (BRE / ERE)

Включает поддержку awk, ed, egrep, emacs, GNUlib, grep, PHP (ereg), MySQL, Oracle, R, sed.PCRE версии или с помощью расширений

ERE / awk / egrep / emacs

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Вне класса символов: . ^ $ * + ? ( ) [ { } \ | & nbsp; & nbsp; & nbsp; & nbsp; Внутри класса символов: ^ - [ ]

BRE / ed / grep / sed

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ; & nbsp; внутри класса символов: ^ - [ ] & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; g16]


Примечания

  • Если неуверенность a bout с определенным символом, он может быть экранирован как \xFF
  • Буквенно-цифровые символы не могут быть экранированы с помощью обратного слэша
  • Произвольные символы могут быть экранированы с помощью обратного слэша в PCRE, но не BRE / ERE (при необходимости их нужно избегать). Для PCRE ] - требуется только экранирование в классе символов, но я сохранил их в одном списке для простоты
  • . Цитированные строки выражения также должны иметь экранированные символы пробега, а часто с обратной косой чертой удвоились ( как "(\")(/)(\\.)" по сравнению с /(")(\/)(\.)/ в JavaScript)
  • . Помимо экранов, различные реализации регулярных выражений могут поддерживать различные модификаторы, классы символов, якоря, кванторы и другие функции. Для получения дополнительной информации посмотрите regular-expressions.info или используйте regex101.com , чтобы проверить свои выражения в реальном времени
41
ответ дан Beejor 16 August 2018 в 03:34
поделиться
  • 1
    В вашем ответе есть много ошибок, включая, но не ограничиваясь: ни один из ваших «современных» для флейворов требуются - или ] для экранирования вне классов символов. POSIX (BRE / ERE) не имеет escape-символа внутри классов символов. Реджейный вкус в RTL Delphi на самом деле основан на PCRE. Python, Ruby и XML имеют свои собственные вкусы, которые ближе к PCRE, чем к POSIX. – Jan Goyvaerts 23 February 2017 в 09:05
  • 2
    @JanGoyvaerts Спасибо за исправление. Вы упомянули о вкусах, которые ближе к PCRE. Что касается побегов, я сохранил их таким образом для простоты; легче запомнить, чтобы убежать повсюду, чем несколько исключений. Властные пользователи будут знать, что происходит, если они хотят избежать нескольких обратных косых черт. Во всяком случае, я обновил свой ответ несколькими разъяснениями, которые, надеюсь, затронут некоторые из этих вещей. – Beejor 7 March 2017 в 04:15
2
ответ дан Charlie Martin 16 August 2018 в 03:34
поделиться

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

Итак, вам действительно нужно знать, какой стиль вы пытаетесь процитировать.

3
ответ дан Darron 16 August 2018 в 03:34
поделиться
20
ответ дан Dillie-O 16 August 2018 в 03:34
поделиться
4
ответ дан Jonathan Leffler 16 August 2018 в 03:34
поделиться
3
ответ дан vaxquis 16 August 2018 в 03:34
поделиться
1
ответ дан zylstra 16 August 2018 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: