Проверка регулярного выражения в Perl или выражение - PullRequest
0 голосов
/ 09 июля 2010

Почему это выражение возвращает true для символа 1 или V (и других)?Как я мог переписать его так, чтобы он возвращал true только тогда, когда он пустой или символ из a-z?

~((^$)||(^[a-z]$))~

Ответы [ 6 ]

8 голосов
/ 09 июля 2010

Ваша проблема посередине:

||

Это значит:

OR the empty string OR

И пустая строка может быть между любым символом. Или нет персонажей. По сути, вы говорите «Совпадение с чем угодно».

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

Вы можете упростить это до:

/^[a-z]?$/
2 голосов
/ 09 июля 2010

Это пример того, почему вы должны предпочесть \z вместо $ для обозначения «конец строки». Шаблон /^[a-z]?$/ будет счастливо соответствовать строке, состоящей из одной новой строки.

#!/usr/bin/perl

use strict; use warnings;

my $s = "\n";

if ( $s =~ /^[a-z]?$/ ) {
    print "string consisting of a single newline matched\n";
}

unless ( $s =~ /^[a-z]?\z/ ) {
    print "string consisting of a single newline did not match\n";
}
2 голосов
/ 09 июля 2010

Пустая строка или один символ в диапазоне az будут:

/^[a-z]?$/

Помните, что ? означает «0 или 1 из этого» - поэтому регулярное выражение переводится в «0 или 1 символ междуa и z включительно ".

Переписав его, чтобы использовать | для" или "(обратите внимание, насколько он уродлив, так что это просто академическое упражнение на данный момент), который вы могли бы сделать:

# nothing, or one character in a-z
/^(?:|[a-z])$/
1 голос
/ 09 июля 2010

Это соответствует, потому что выражение содержит ||.Оператор регулярного выражения 'или' является единственным |;два из них означают «или ничего или», и каждая строка будет соответствовать пустому выражению без якорей.

В любом случае, ваше регулярное выражение кажется немного сложным ... как насчет /^([a-z]?)$/?

0 голосов
/ 09 июля 2010
/\A(\p{Lower})?\z/
0 голосов
/ 09 июля 2010

Не могли бы вы изменить его на что-то вроде этого:

^([a-z]?)$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...