Регулярное выражение для последовательности дефисных пар ключ-значение - PullRequest
2 голосов
/ 08 июня 2011

мне нужно проверить текстовое поле для этого формата ввода данных -

"TeSt12-12TeSt, 12Test-АВ12, ...."

, который в основном представляет собой последовательность значений ключа (дефиса), разделенных запятой (,)

Readlike

anyAlphaNumeric, за которым следует дефис anyAlphaNumeric, затем «необязательный отсюда» запятая и anyAlphaNumeric, за которым следует дефис anyAlphaNumeric, затем запятая и anyAlphaNumeric, за которым следует дефис anyAlphaNumeric ...

Здесь 1 может быть A-Z, a-z, 0-9 Примеры - 11-11 действует 111-111, недействительно (запятая должна сопровождаться другим набором значения ключа) 1-1,1-1 действителен 1 - недействительно (значение отсутствует после дефиса) 1-1,111-111,11-11111,111-111111 действителен

Ответы [ 3 ]

5 голосов
/ 08 июня 2011

Все в порядке:

^        # Start of string
\w+      # Match any alnum,
-        # hyphen,
\w+      # any alnum.
(?:      # Try to match...
 ,       # comma,
 \w+     # any alnum,
 -       # hyphen,
 \w+     # any alnum
)*       # zero or more times.
$        # Match end of string.

или (как не многословное регулярное выражение):

^\w+-\w+(?:,\w+-\w+)*$

Имейте в виду, что \w также будет соответствовать подчеркиванию (и в среде .NET может также соответствовать буквам и цифрам Unicode. Если вы не хотите этого, используйте [A-Za-z0-9] вместо \w.

1 голос
/ 08 июня 2011
^[a-zA-Z0-9]+-[a-zA-Z0-9]+(,[a-zA-Z0-9]+-[a-zA-Z0-9]+)*$

или для упрощения

[^-]+-[^,]+(,[^-]+-[^,]+)*

[^ -] это означает все, что не "-"

1 голос
/ 08 июня 2011

Вам нужно немного разбираться в выполнении регулярных выражений, чтобы иметь возможность создавать что-то подобное, и когда дело доходит до повторений (в частности, разделенных запятыми списков), вам часто приходится делать немного больше. Это должно сработать.

([^-]+-[^,]+)(,[^-]+-[^,]+)*

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

Этот фрагмент соответствует следующему.

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

Причина, по которой каждый класс символов является чем-то иным, кроме разделителя, заключается в том, что жадный механизм регулярных выражений в противном случае не понял бы, что необходимо принять решение, учитывая текущий импульс. Большинство проблем с регулярными выражениями связано с неудачным пониманием жадной природы регулярных выражений (есть и ленивые движки, но они медленнее и не совсем стандартное регулярное выражение)

Вы можете переписать шаблон так, чтобы он стал более практичным в использовании:

(?:(?<key>[^-]+)-(?<value>[^,]+))(?:,(?<key>[^-]+)-(?<value>[^,]+))*
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...