Руководство для начинающих по интерпретации Regex? - PullRequest
2 голосов
/ 22 июня 2010

Привет.

Мне было поручено отладить часть приложения, в которой используется Regex, но я никогда раньше не имел дело с Regex. Два вопроса:

1) Я знаю, что регулярные выражения должны проверять, эквивалентны ли две строки, но что конкретно означают два приведенных ниже выражения регулярного выражения в простом английском языке?

2) У кого-нибудь есть рекомендации на сайтах / источниках, где я могу узнать больше о регулярных выражениях? (желательно на C #)

if (Regex.IsMatch(testString, @"^(\s*?)(" + tag + @")(\s*?),", RegexOptions.IgnoreCase))
                {
                    result = true;
                }
else if (Regex.IsMatch(testString, @",(\s*?)(" + tag + @")(\s*?),", RegexOptions.IgnoreCase))
                {
                    result = true;
                }

Ответы [ 14 ]

5 голосов
/ 22 июня 2010

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

Грубо говоря, для первого регулярного выражения:

  • ^ говорит, что совпадает в начале строки.
  • (...) устанавливает группу захвата (которая доступна, хотя в этом примере она явно не используется).
  • The \s соответствует любым пробелам (пробелы, символы табуляции и т. Д.)
  • *? соответствует нулю или более предыдущего символа (в данном случае, пробела), и поскольку он имеет знак вопроса,он соответствует минимальному количеству символов, необходимому для работы остальной части выражения.
  • (" + tag + @") вставляет содержимое tag в регулярное выражение.Как я уже говорил, это опасно, без экранирования.
  • * (\s*?) соответствует тому же, что и раньше (минимальное количество пробельных символов)
  • * , соответствует запятой в конце.

Второе регулярное выражение очень похоже, но ищет начальную запятую (а не начало строки).

Мне нравится документация Python для регулярных выражений, но выглядит этот сайт содержит довольно хорошее базовое введение с примерами на C #.

1 голос
/ 22 июня 2010

Поскольку вы специально пометили C #, я рекомендую Regex Hero в качестве инструмента, который вы можете использовать для игры с ними, так как он работает в .NET. Он также позволяет переключать различные флаги RegexOptions так же, как вы передаете их в конструктор при создании нового Regex.

Кроме того, если вы используете версию Visual Studio 2010, которая поддерживает расширения, я бы посмотрел на расширение Regex Editor ... оно будет появляться всякий раз, когда вы набираете new Regex( и предлагаете некоторые указания и автозаполнение для вашего шаблона регулярных выражений.

1 голос
/ 22 июня 2010

Я не разбираюсь в c #, но могу порекомендовать отличное руководство по регулярным выражениям, которое я использую для программирования на Bash и Java. Это относится практически ко всем языкам:

http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124/ref=tmm_pap_title_0

Стоимость этой книги - 30 долларов. Это ОЧЕНЬ основательно и очень помогло моему фундаментальному пониманию Regex.

-Ryan

1 голос
/ 22 июня 2010

Использование Regex Coach

The regular expression is a sequence consisting of the expression '(\s*?)', the expression '(tag)', the expression '(\s*?)', and the character ','.

, где (\ s *?) Определяется как The regular expression is a repetition which matches a whitespace character as often as necessary.

второйсоответствует , в начале тоже

Что касается сайтов с хорошим обучением, мне нравится www.regular-expressions.info /

Супер простая версия:

В начале строки 0 или более пробелов, какой бы ни был тег, 0 или более пробелов, запятая.

второй -

запятая, 0 или более пробелов, какой бы ни был тег, 0 или более пробелов, запятая.

1 голос
/ 22 июня 2010

Одно слово - Лист (или это два?):)

0 голосов
/ 31 декабря 2012

также отличный сайт для проверки ваших регулярных выражений с дополнительной информацией: http://regex101.com/

0 голосов
/ 22 июня 2010

Хотя он не использует C #, Rejex - это простой инструмент для тестирования и изучения регулярных выражений, включающий краткий справочник по специальным символам

0 голосов
/ 22 июня 2010

Регулярное выражение не сообщает вам, совпадают ли две строки, а если строка соответствует шаблону.

Этот сайт мой любимый для изучения и тестирования регулярных выражений:

http://gskinner.com/RegExr/

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

0 голосов
/ 22 июня 2010

http://www.myregextester.com/ - достойный тестер регулярных выражений, который также имеет опцию объяснения для C# регулярных выражений - для экземпляра посмотрите этот пример :

The regular expression:

(?-imsx:^(\s*?)(tagtext)(\s*?),)

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ^                        the beginning of the string
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    \s*?                     whitespace (\n, \r, \t, \f, and " ") (0
                             or more times (matching the least amount
                             possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  (                        group and capture to \2:
----------------------------------------------------------------------
    tagtext                  'tagtext'
----------------------------------------------------------------------
  )                        end of \2
----------------------------------------------------------------------
  (                        group and capture to \3:
----------------------------------------------------------------------
    \s*?                     whitespace (\n, \r, \t, \f, and " ") (0
                             or more times (matching the least amount
                             possible))
----------------------------------------------------------------------
  )                        end of \3
----------------------------------------------------------------------
  ,                        ','
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------
0 голосов
/ 22 июня 2010

1) Первое регулярное выражение пытается выполнить регистронезависимое совпадение, начиная с начала тестовой строки.Затем он соответствует необязательному пробелу, за которым следует все, что находится в теге, за которым следует необязательный пробел, а затем запятая.

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

Думал, что это для C # Я рекомендую выбрать Perl Pocket Reference, который имеет отличный синтаксический справочник Regex.Это очень помогло мне, когда я изучал регулярные выражения 14 лет назад.

...