Нужна помощь в создании регулярного выражения для соответствия определенной строке (пример внутри) - PullRequest
3 голосов
/ 25 августа 2009

Я работаю над программой, в которой мне нужно сопоставить регулярное выражение и строку. Строка на самом деле довольно простая, но у меня проблемы с моим текущим регулярным выражением (я использую движок регулярных выражений .net)

Мое текущее регулярное выражение: «^ [VvEeTtPp] [^ a-zA-Z0-9 \ s] \ d {0,12}? $"

Теперь строка, которую я хочу сопоставить, всегда следует этому шаблону

  1. Сначала одна буква (допустимы только буквы V, E, P, T в любом случае)
  2. Затем, тире
  3. Наконец, от 4 до 12 цифр.

Существует последнее ограничение, заключающееся в том, что регулярное выражение должно соответствовать любой подстроке, которая соответствует правилам (например, "V" или "E-" или "P-123")

Регулярное выражение работает довольно хорошо, но оно будет принимать такие вещи, как "V -".

Может ли кто-нибудь помочь мне написать лучшее выражение ??

Спасибо

Ответы [ 5 ]

3 голосов
/ 25 августа 2009

Это должно сделать это:

^[EPTVeptv](-(\d{4,12})?)?$

Edit:
Для сопоставления подстрок, таких как «P-123», «-123» и «123»:

^(?=.)[EPTVeptv]?(-\d{,12})?$

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

2 голосов
/ 25 августа 2009

Ну, подстрока правила 4-12 на самом деле просто делает его правилом 1-12, так как насчет:

        Regex re = new Regex(@"^[VvEeTtPp](-|-[0-9]{1,12})?$");
        Console.WriteLine(re.IsMatch("B"));
        Console.WriteLine(re.IsMatch("V"));
        Console.WriteLine(re.IsMatch("E-"));
        Console.WriteLine(re.IsMatch("P-123"));
        Console.WriteLine(re.IsMatch("V--"));
1 голос
/ 25 августа 2009

Я думаю, что этот шаблон соответствует спецификации.

string pattern = @"^[VvEePpTt](?:$|-(?:$|\d{1,12}$))";
// these are matches
Console.WriteLine(Regex.IsMatch("V", pattern));
Console.WriteLine(Regex.IsMatch("v-", pattern));
Console.WriteLine(Regex.IsMatch("P-123", pattern));
Console.WriteLine(Regex.IsMatch("t-012345678901", pattern));
// these are not
Console.WriteLine(Regex.IsMatch("t--", pattern));
Console.WriteLine(Regex.IsMatch("E-0123456789012", pattern));

Распределение по шаблону:

^             - start of string
[VvEePpTt]    - any of the given characters, exactly once
(?:           - start a non-capturing group...
$|-           - ...that matches either the end of the string or exactly one hyphen
(?:           - start a new non-capturing group...
$|\d{1,12}$   - that matches either the end of the string or 1 to 12 decimal digits
))            - end the groups
1 голос
/ 25 августа 2009

Можете ли вы попробовать это и сказать мне, если это работает?

^[VvEeTtPp](-(\d{4,12}){0,1}){0,1}$

Принимается один символ из указанных, за которым следует либо ничего, либо одна черта, за которой, в свою очередь, не следуют 4-12 цифр или 4-12 цифр, и они совпадают. Например:

  • V
  • ** V - ** 12
  • V 12
  • V-12345
  • * * Р тысячу двадцать-один-123456789012 3

РЕДАКТИРОВАТЬ: добавлен $ в конце, поэтому он не будет работать, если строка содержит дополнительные символы

1 голос
/ 25 августа 2009

[VvEePpTt] - \ d {4,12}

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