2013-06-04 4 views
-2

Я обертываю свою первую строку контента в одинарных кавычках, чтобы упростить то, что я прошу. Его не завернутый в мой код.Почему это регулярное выражение не оценивается как true в perl?

'{ 
# "ERROR" : [ 
#  "generic error message" 
# ] 
# }' =~ { 

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

+3

Да? Какие? Этот код не является полным. Вы имели в виду регулярное выражение '/ {/' (которое работает)? – amon

+0

теперь не perl, но возможно избежать его, потому что это метасимвол? '\ {' –

+0

@ Вам нужно обернуть ваше регулярное выражение при оценке с помощью оператора ~ ~ в perl? – Rooster

ответ

3

В таких языках, как PHP, регулярное выражение просто обычная строка, в комплекте с кавычками: "/regex/". С другой стороны, Perl имеет литералы регулярных выражений. Они непосредственно встроены в код, но все же нужны разделители.

В общем, это выглядит следующим образом:

$string =~ /regex/ 

Слеши являются разделителем по умолчанию. если слэши являются неудобным разделителем, вы можете выбрать любой другой (1) -just prefix regex с m (для соответствия). Эти матчи эквивалентны:

$url =~ /http:\/\///; 
$url =~ m/http:\/\///; 
$url =~ m{http://}; 

Если вы хотите сохранить прекомпилированный регулярное выражение в переменной, вы можете использовать qr// кавычки. Предпочитают их на простые строки, потому что qr// регулярных выражения следуют тем же цитируя правила, как регулярные выражения (не двойной ускользает):

my $url_regex = qr~http://~; 
$url =~ $url_regex; 

Оператор =~ привязывать прилагает все усилиями, чтобы интерпретировать правую руку аргумент как регулярное выражение, так что вы могли бы даже использовать строки, в PHP, как мода:

"123\nab12" =~ "\\d\n\\w+"; # double escaping sucks, still matches 

но уступает /\d\n\w+/.

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

# "=~" has higher precedence than "+". 
# Establishing precedence is the *sole* task of the parens here 
"112" =~ (1+2); # fails 
"3" =~ (1+2); # matches 
"112" =~ /1+2/; # matches 

  1. Не используйте вопросительные знаки в качестве регулярных выражений разделителей, это матч только один раз.
2

Попробуйте это:

'your string' =~ /\{/ 

Ваш синтаксис не действует, как показано, так как { не является регулярным выражением. Чтобы исправить эту проблему, я завернул ее в символы регулярного выражения по умолчанию, чтобы получить /{/, а затем экранировал { (в результате получилось /\{/), потому что это метасимвол синтаксиса регулярных выражений. (Для регулярных выражений x{a,b} означает, что x следует повторить по крайней мере a и в большинстве b раз.)

+2

На самом деле это не может быть проблемой: perl достаточно умен, чтобы понять, что '{' in '/ {/' не является метасимволом. – amon

+0

Вы правы. Однако в приведенном выше коде просто используется символ '{', а не регулярное выражение (например, '/ \ {/'). Когда я исправил синтаксис, я избежал '{', который я объясняю, но вы правы, что это не ясно. Я уточню свой ответ. – sigpwned

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