2013-09-04 4 views
3
the regex expression is as below: 
if ($ftxt =~ m|/([^=]+)="(.+)"|o) 
    { 
    ..... 
    } 

Это регулярное выражение кажется отличным от многих других регулярных выражений. Что меня пугает, это «|» , большинство регулярных выражений используют «/» вместо «|». И группа ([^ =] +) также меня смущает. Я знаю, что [^ =] означает «начало строки» или «=», но что это означает повторением «^» один или несколько раз? , как это объяснить?В чем смысл этого выражения регулярного выражения perl?

+1

Ваша интерпретация '[^ =]' ложна. Скобки в регулярном выражении запускают класс отдельных символов для соответствия, а '^' в начале отрицает его. В другом месте внутри скобок он ведет себя буквально (и многие другие персонажи теряют свое особое значение внутри скобок). Без скобок '^ =' будет соответствовать знаку равенства в начале строки. – Benoit

+0

[Объясните это регулярное выражение для меня] (http://blog.nu42.com/2010/09/explain-this-regex-to-me.html): Используйте [YAPE :: Regex :: Explain] (http://search.cpan.org/perldoc/YAPE::Regex::Explain). –

ответ

6

Вы можете использовать разные разделители вместо /. Например, вы могли бы использовать:

m#/([^=]+)="(.+)"#o 

Или

m~/([^=]+)="(.+)"~o 

Преимущество здесь использовать что-то другое, чем / является то, что вам не придется бежать косую черту, потому что в противном случае, вы должны использовать :

m/\/([^=]+)="(.+)"/o 
^

[Или [/]]

([^=]+) - группа захвата, а внутри - [^=]+. [^=] является отрицательным классом и будет соответствовать любому символу, который не является =.

^ ведет себя по-другому в начале символьного класса и не совпадает с ^ вне символьного класса, что означает «начало строки».

Что касается последней части o, это флаг, который я не встречал до сих пор так мало поиск привел меня к this post, цитирую:

Модификатор /o в документации perlop вместо документа perlre, так как это модификатор, похожий на цитату, а не модификатор регулярного выражения. Это всегда казалось странным для меня, но так оно и есть.

Перед Perl 5.6 Perl перекомпилирует регулярное выражение, даже если переменная не изменилась. Вам больше не нужно это делать. Вы можете использовать /o для компиляции регулярных выражений один раз, несмотря на дальнейшие изменения в переменной, но, как указывали другие ответы, qr// лучше для этого.

4
  1. Некоторые реализации регулярных выражений позволяют использовать другие специальные символы, кроме / в качестве разделителя. Это полезно, если вам нужно использовать этот специальный символ внутри самого регулярного выражения, так как вам не нужно его избегать. (Сам по себе / не является особым символом в синтаксисе regexp, но ему нужно экранировать, если он используется в regexp literal синтаксиса основного языка.) В документах на Perl's quote operators упоминается об этом.

  2. Это материал учебного уровня: квадратные скобки ([abc]) обозначают класс символов - это означает «любой символ внутри скобок». (В моем примере это означает «либо a, либо b или c.) Внутри них специальный символ ^ имеет другое значение, оно инвертирует класс персонажа.Таким образом, [^=] означает «любой символ за исключением=» и [^=]+ означает «один или несколько символов, которые не являются =».


Цитирование документы на Perl's RE syntax:

Вы можете указать класс символов, заключив список символов в [], который будет соответствовать любому символу из списка. Если первый символ после «[» равен «^», класс соответствует любому символу, не указанному в списке.

2

Он предназначен для соответствия уравнениям, аналогичным выражениям, для захвата ключа и значений отдельно. Представьте, что у вас есть заявление вроде height="30px", и вы хотите записать имя атрибута height, а также его значение 30px.

У вас есть m|/([^=]+)="(.+)"|.

Ключ должен быть всем, перед тем как встретится =. Итак, [^=] захватывает его. ^ является метасимволом отрицания при использовании в качестве первого символа внутри скобок []. Это означает, что он будет соответствовать любому символу, кроме =, который вы хотите. /, вероятно, является ошибкой, если вам нужно захватить группу, вы не должны ее использовать, или если она действительно предназначена, это означает, что буквально соответствует открывающим круглым скобкам. Поскольку это особый символ, его нужно избегать, поэтому \(. если вы хотите захватить группу, это должно быть ([^=]+).

Далее идет знак =, который вас не волнует. Затем кавычки, которые содержат значение. Таким образом, вы фиксируете его как "(.+)". .+ пойдет на совпадение каждого героя, включая финальный ". Но тогда он найдет, что он не может соответствовать финальному " в регулярном выражении, поэтому он будет возвращаться назад, отказываться от последнего " захваченного регулярного выражения (.+), чтобы оставить строку внутри кавычек, которые будут записаны в группе. Теперь вы готовы получить ключ и значение через $1 и $2. Круто, не так ли?

Смежные вопросы