2012-09-14 1 views
4

Что означает [[]] Среднее значение в регулярном выражении?Что означает "[[]]" в регулярном выражении?

$ echo '[][]' | grep -oE '[[]]' 
[] 
[] 
$ grep --version 
grep (GNU grep) 2.10 

Хм, это кажется, что он соответствует []. (Последовательности символов [], а не [ или ].) (Я тестировал его с модулем python, таким же результатом.) Действительно? Если да, то почему?

Я знал, что если я хочу, чтобы соответствовать [ или ], я должен был бы написать [][] или [[\]]. (Они работают в PCRE, grep поддерживает [][], но не [[\]], так как \ теряет особое значение в выражении скобки grep.) Я только испытываю любопытство.

+0

Похоже, я неверно сформулировал ваш вопрос. – BoltClock

+0

@BoltClock Я немного изменил свой вопрос. (укажите, что '[]' является последовательностью). Надеюсь, теперь это станет более ясным.) – weakish

ответ

4

Выражение [[]] фактически состоит из двух конкатенированных подвыражений: [[] и ].

  • [[] - это класс символов, который соответствует только [ символам. Наличие [ возможно только в самом начале класса символов.
  • ] является нормальным символом, если вне класса символов.

Оба объединяются таким образом, ваше выражение соответствует любому символу из [ следует ], что приводит к соответствию [].

+0

Если вы хотите попробовать больше таких вещей, попробуйте выражения типа '[[] x' или'] [[] ':) – Michael

+0

В JAVA, '' foo [bar ".matches (" [[]] ");' throws the PatternSyntaxException': * Unclosed character class рядом с индексом 3 *, потому что вам нужно избежать внутренних скобок: '' [ \\ [\\]] "'. – sp00m

+0

@ sp00m Спасибо, что указали это. На некоторых языках '[[]' просто незаконно. – weakish