Как использовать регулярное выражение для сопоставления числа переменной длины с дефисами в середине? - PullRequest
1 голос
/ 26 февраля 2009

Я хочу регулярное выражение .net для следующего:

Пользователь может ввести значение, например tcm:12312312-221231323 или tcm:23121231-23423423-34234234

Все записи, кроме "tcm" и дефиса, будут числовыми. Будет один или два дефиса.

Ответы [ 5 ]

4 голосов
/ 26 февраля 2009
^tcm:\d{8}-(\d{9}|\d{8}-\d{8})$

Это или tcm: (восемь цифр) - (девять цифр) или tcm: (восемь цифр) - (восемь цифр) - (восемь цифр)


^tcm:\d+(-\d+){1,2}$

Если вы ищете tcm: (несколько цифр) - (несколько цифр) или tcm: (несколько цифр) - (несколько цифр) - (некоторые цифры)

2 голосов
/ 26 февраля 2009

Попробуйте этот, который требует две группы или три группы

tcm:\d+-\d+(-\d+)?

Если есть ограничения на длину чисел, попробуйте что-то вроде:

tcm:\d{4,8}-\d{4,8}(-\d{4,8})?

(где 4 и 8 - минимум и максимум для каждой группы)

0 голосов
/ 26 февраля 2009

Мне не ясно, хотите ли вы проверить ввод и просто сопоставить ввод или хотите извлечь данные.

Если вам просто нужно сопоставить ввод, чтобы проверить его, то:

 ^tcm:\d+(-\d+){1,2}$

Будет соответствовать только если есть 2 или 3 группы цифр, не меньше, не больше.

Если вам необходимо учесть возможные пробелы, вы можете изменить регулярное выражение следующим образом:

 ^tcm\s*:\s*\d+\s*(-\s*\d+){1,2}\s*$

Если вы хотите извлечь каждый набор цифр:

  • В Perl вы бы использовали массив @result, который содержал бы 2 или 3 группы цифр, только если весь шаблон соответствовал (строка subject содержит строку, из которой вы хотите извлечь данные). 1019 *

    my @result = $subject =~ /^tcm:(\d+)-(\d+)(?:-(\d+))?$/;
    
  • В C # вы можете сделать эквивалентную вещь:

    MatchCollection results = null;
    Regex r = new Regex(@"^tcm:(\d+)-(\d+)(?:-(\d+))?$");
    results = r.Matches(subject);
    if ((results.Count == 2) || ((results.Count == 3))) {
        // use results.Item[] to access each group of digits
    } else {
        // The subject doesn't match
    }
    
0 голосов
/ 26 февраля 2009

Ну, тире в середине числа не числовой ...;)

Вот несколько вариантов:

Если тире необязательны:

^tcm:[\d\-]+$

Если тире необязательны, но могут не встречаться первыми или последними:

^tcm:\d[\d\-]*\d$

Если требуется хотя бы одна тире:

^tcm:\d*-[\d\-]+$

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

^tcm:\d+-[\d\-]*\d$

Если тире не обязательны, но могут не встречаться ни в начале, ни в конце, ни рядом друг с другом:

^tcm:\d+(-\d+)*$
0 голосов
/ 26 февраля 2009

Вы имеете в виду:

ткм: [\ d -] +

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