Как включить хотя бы один раз каждый элемент в группу выбора без тестирования? - PullRequest
2 голосов
/ 03 июля 2019

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

  • 8-символьная длина
  • начинается с Q
  • содержит сочетание заглавных букв и цифр
  • содержит как минимум 1 цифру и 1 букву, отличную от начального Q
  • оканчивается буквой или цифрой

Например:

  • QC1589ZH действителен ref
  • Q1234567 не является действительным ref
  • КОЛИЧЕСТВО не является действительным ref

Регулярное выражение будет использоваться в инструменте перевода, чтобы выбирать строки текста и блокировать их. Он не будет частью кода и, следовательно, не может быть протестирован или разделен. Программное обеспечение использует регулярные выражения .NET. Я могу использовать взгляды и взгляды, если это помогает. Ссылка всегда окружена пробелами, переносами строк или в начале или в конце строки.

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

\bQ[A-Z0-9]{7}\b

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

Ответы [ 4 ]

2 голосов
/ 03 июля 2019
\bQ(?=.*[A-Z])(?=.*\d)[A-Z\d]{7}\b
  • (?=.*[A-Z]) гарантирует, что он содержит хотя бы одну букву после начальных Q.
  • (?=.*\d), гарантирует, что он содержит хотя бы одну цифру.
  • [A-Z\d]{7} требует, чтобы оно содержало ровно 7 букв или цифр после начальных Q.
  • \b, соответствующих границам слов.

https://regex101.com/r/zEgjYk/1

2 голосов
/ 03 июля 2019

Ваш текущий шаблон \bQ[A-Z0-9]{7}\b не учитывает обязательные прописные буквы и цифры, поскольку класс символов соответствует любому из перечисленных.

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

\bQ(?=[A-Z0-9]*[A-Z])(?=[A-Z0-9]*[0-9])[A-Z0-9]{7}\b
  • \bQ Граница слова и совпадение Q
  • (?=[A-Z0-9]*[A-Z]) Утверждение заглавной буквы
  • (?=[A-Z0-9]*[0-9]) Утвердить цифру
  • [A-Z0-9]{7} Совпадение 7 раз, соответствующее любому классу персонажей
  • \b Граница слова

.NET regex demo

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

\bQ(?=[A-Z0-9-[Q]]*[A-Z-[Q]])(?=[A-Z0-9-[Q]][0-9])[A-Z0-9-[Q]]{7}\b

.NET Regex demo

0 голосов
/ 03 июля 2019
(?i)^Q(?=.*[0-9])(?=.*[a-z-[q]]+[^Q]$)[a-z0-9]{7}$

(?i) Поиск без учета регистра

^Q Строка начинается с Q

(?=.*[0-9]) Строка подтверждения содержит числа

(?=.*[a-z-[q]]+[^Q]$) Строка подтверждения содержит буквы, кроме Q и не заканчивается Q.

[a-z0-9]{7} Осталось 7 буквенно-цифровых символов

$ Конец строки

C # код:

var texts = new List<string>
{
    "QC1589ZH",
    "Q1234567",
    "Q12FQ457",
    "Q123F56Q",
    "QUANTITY"
};

foreach (string text in texts)
{
    var pattern = @"(?i)^Q(?=.*[0-9])(?=.*[a-z-[q]]+[^Q]$)[a-z0-9]{7}$";
    WriteLine($"Text: {text}, Is match: {Regex.IsMatch(text, pattern)}");
}

/*
    Output:
    Text: QC1589ZH, Is match: True
    Text: Q1234567, Is match: False
    Text: Q12FQ457, Is match: False
    Text: Q123F56Q, Is match: False
    Text: QUANTITY, Is match: False
*/
0 голосов
/ 03 июля 2019

Я предполагаю, что это выражение, например, может соответствовать нашим желаемым правилам:

\bQ(?=.*[0-9])[A-Z0-9]{7}\b 

Демо

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