2016-03-22 5 views
-2

В чем основное отличие между тремя регулярными выражениями.Что такое различие между этими тремя регулярными выражениями

1) /^[^0-9]+$/

2) /[^0-9]+/

3) m/[^0-9]+/

Я действительно пытаюсь понять это, так как исследования в Интернете не помогло мне много я надеялся, что я мог бы найти помощь здесь ,

+2

https://metacpan.org/pod/YAPE::Regex::Explain – toolic

ответ

3

Все они имеют [^ 0-9] +, которая представляет собой один или несколько символов, которые не числа 0, 1 ... к 9.

  • Первый из них /^[^0-9]+$/ закреплен в начале и в конце строки, так что он будет соответствовать любой строке, которая содержит только не-цифр.
  • Второй /[^0-9]+/ не привязан, поэтому он соответствует любой строке, содержащей хотя бы одну (или более) нецифровую цифру.
  • Третий m/[^0-9]+/ такой же, как второй, но явно использует m// match operator.

Для хорошего объяснения, проверить regex101.com для first и second регулярных выражений.

+0

Учитывается ли символ новой строки? Потому что в одном из примеров, который я видел, когда используется '/ [^ 0-9] + /', строка с номером 4 на нем является совпадением. Но когда используется 'm/[^ 0-9] + /', и в этой же строке используется функция chop(), строка с четырьмя на ней больше не является совпадением. –

+0

Я не совсем понимаю, что вы имеете в виду. Почему бы вам не попробовать себя? Вы также можете использовать 're 'debug';', чтобы получить дополнительные объяснения того, что происходит. – simbabque

2

Существует разница между регулярным выражением и оператором соответствия, который принимает регулярное выражение как его операнд.

У вас есть только два регулярных выражения: ^[^0-9]+$ и [^0-9]+. Вариант 3 использует такое же регулярное выражение, как и вариант 2, но использует другую версию оператора соответствия.

Разница между 1 и 2 заключается в том, что 1 закреплен в начале и в конце строки, тогда как 2 вообще не привязан.

Итак, 1 говорит: «Сопоставьте начало строки, за которой следует одна или несколько цифр, а затем конец строки». 2 говорит, что «соответствует одному или нескольким без цифр в любой строке».

Это вообще помогает?

+0

Совершает ли 2/3 символ новой строки для соответствия? Потому что в примере, который я видел, число «4» находится в отдельной строке, а когда/[^ 0-9] +/используется, оно соответствует этой строке. Но когда используется функция chop() и символ новой строки удаляется, линия больше не сопоставляется. –

+0

Является ли ваш вопрос «делает символ новой строки' [^ 0-9] ', тогда я бы подумал, что это довольно просто проверить -' perl -E'say '\ n "= ~/[^ 0-9]/?«Да»: «Нет» ''(который печатает« Да ») –

1

Узор [^0-9] является общим для этих трех регулярных выражений, и будет соответствовать любому символу, который не десятичной цифра

  1. /^[^0-9]+$/

    This якорей шаблон к началу и конец строки, и настаивает на том, что он содержит один или несколько цифр без цифры

    Обходной ^ является нулевой шириной якорь, который соответствует началу строки

    знака доллара $ также нулевой ширина якорь, который будет соответствовать либо в конце строки или перед символом новой строки, если это символ новой строки является последний в строке. Так что это будет соответствовать "aaa" и "aaa\n" но не "aa7bb\n"

  2. /[^0-9]+/

    Это не имеет якоря, и так будет возвращать истинную, если строка содержит, по меньшей мере, один не цифровой символ в любом месте

    Это будет матч "12x345" и сбой для соответствия "12345". Обратите внимание, что символ новой строки, считается, что нецифрового характер, так что эта модель будет соответствовать "123\n"

  3. m/[^0-9]+/

    Это идентично # 2, но с m помещен в явном виде. Это необязательно, если вы используете дефолты по умолчанию для разделителей, но может быть удобно использовать что-то другое, если вы соответствуете шаблону, например, пути к файлу, который сам содержит косые черты.

    Использование m позволяет выбрать ваш собственный разделитель, например m{/my/path} вместо /\/my\/path/

В сущности, # 1 спрашивает ли строка полностью состоит из не-цифровых символов, а # 2 и # 3 идентичны, и проверить, является ли строка содержит не менее одного символ без цифр

+0

Учитывает ли символ 2/3 символ новой строки? Потому что в примере, который я видел, число «4» находится в отдельной строке, а когда/[^ 0-9] +/используется, оно соответствует этой строке. Но когда используется функция chop() и символ новой строки удаляется, линия больше не сопоставляется. –

+0

@ J.Doe: Да. Новая строка похожа на любой другой символ для каждой конструкции регулярных выражений, отличной от '$'. Как я уже сказал, '[^ 0-9] +' будет соответствовать любому, содержащему хотя бы один символ, если там есть не цифра. Таким образом, он будет соответствовать '' \ n "' просто отлично. Когда вы читаете строки текста из файла или из терминала, вы должны * * chomp' получить результат, поскольку новая строка будет путать любую проверку, которую вы делаете. Проверка на числовой ввод должна быть следующей, если/\ S/и не/\ D/'i.e пропускать эту строку, если не имеет пробелов и не имеет цифр – Borodin

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