Perl Regex .. Простое утверждение if - PullRequest
1 голос
/ 22 октября 2011

Я работаю над функцией Perl (или я должен сказать подпрограмму?) И относительно новичок в Perl (и регулярных выражениях).

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

Мне нужно проверить, начинается ли строка:

  • с необязательного пробела
  • после белого-space содержит 0 или 1 экземпляр строки, заключенной в квадратные скобки .. (т.е. [test])

Написанное мной регулярное выражение: ^\s*{\[$testString\]}?$

Этоне работает.Однако я не смог заставить его работать с регулярными выражениями вообще, поэтому мне интересно, правильно ли я это делаю.

Сейчас тестовый пример, с которым я работаю,Строка, я хочу, чтобы значение true было равно [fallback_test].

Когда я делаю

if ($string eq ' [fallback_test]')

, тогда это работает.Однако, если я сделаю

if ($string =~ /fallback_test/)

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

^\s*{\[$testString\]}?$

Итак, мои вопросы ...

  • Почему регулярные выражения не работают для меня?
  • Будет ли это регулярное выражение делать то, что я хочу, когда я получу регулярное выражение в этом блоке?

Ответы [ 4 ]

0 голосов
/ 24 августа 2013

Почему вы добавляете фигурные скобки в свое регулярное выражение?они используются для указания количества повторений, например, /\d{5}/.

Чтобы сделать то, что вы хотите, это должно быть так:

$string =~ m/^ ?(?:\[\Q$testString\E\])?$/

\Q...\E должно спасти нас от ошибок времени выполнения, когдаметасимвол может быть интерпретирован в регулярном выражении.

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

0 голосов
/ 22 октября 2011

Вам необходимо сгруппировать необязательную строку.Вот рабочий пример:

$string =~ /^\s*(?:\[.*?\])?$/;

А вот Perl Oneliner для тестирования:

perl -e 'die "not matched!" unless " [fallback_test]" =~ /^\s*(?:\[.*?\])?$/'

Объяснение:

В регулярном выражении (subpattern) groups subpatternи сохраняет сопоставленный результат в переменных $ 1 .. $ 9.(?:subpattern) группирует подшаблоны, но не хранит совпавший результат нигде..*? будет соответствовать всем символам до первого символа ']'.Вы можете заменить это вашей тестовой строкой, такой как «fallback_test» или «test», или каким-либо регулярным выражением, которое вы удовлетворяете вашим требованиям.

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

0 голосов
/ 23 октября 2011

Таким образом, вместо {} ?, use ()? Требуется группировка.

FWIW ваше регулярное выражение будет соответствовать только 4 различным комбинациям, так как вы закрепили
строка на границах с ^ $ и имеет 2 необязательных подвыражения.

1 '' пустая строка
2 '' все пробелы 3 '[строка]' просто [строка]
4 пробела «[строка]», за которыми следует [строка]

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

Например:
edit добавление quotemeta в регулярные выражения

if ($ str = ~ / ^ (\ s *) (\ [\ Q $ testString \ E \])? $ /) {
..тест $ 2 за строку
..тест $ 1 за ведущие пробелы

Но если [string] требуется, лучшим регулярным выражением будет
/^(\s*)\[\Q$testString\E\]$/, затем проверьте $ 1, если он содержит дополнительные пробелы.

0 голосов
/ 22 октября 2011

Если у вас есть что-то вроде: my $testString = "fallback_test";

Попробуйте: /^\s*\[${testString}\]?$/

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