Как проверить регулярное выражение

Мне трудно группировать части регулярного выражения. Я хочу проверить несколько вещей в строке следующего формата: I-XXXXXX.XX.XX.XX

  1. Убедитесь, что первый набор из 6 X (I-xxxxxx.XX.XX.XX) не содержит символов и его длина не превышает 6.

  2. Убедитесь, что третий набор X (I-XXXXXX.XX.xx.XX) не содержит символов и состоит только из 1 или 2.

Теперь я уже проверил последний набор XX, чтобы убедиться, что числа 1-8, используя

string pattern1 = @"^.+\.(0?[1-8])$";

Match match = Regex.Match(TxtWBS.Text, pattern1);
            if (match.Success)
            ;
            else
            { errMessage += "WBS invalid"; errMessage += 
Environment.NewLine; }

Я просто не могу понять, как настроить таргетинг на определенные части строки. Любая помощь будет принята с благодарностью и заранее благодарна!

Используйте разделение на '.' символ и выполнять отдельные строки. Или используйте группировку и проверьте совпадение по группам.

DevEstacion 12.07.2019 18:44

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

EJoshuaS - Stand with Ukraine 12.07.2019 18:55

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

juharr 12.07.2019 20:10
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
80
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

У вас возникли проблемы с добавлением новой проверки в эту строку, потому что она очень общая. Давайте посмотрим, что вы делаете:

^.+\.(0?[1-8])$

Это находит следующее:

  • ^ начало строки

  • .+ все, что может, кроме новой строки, в основном перескакивает курсор движка в конец вашей строки

  • \. последний период в строке из-за жадного квантификатора в .+, который стоит перед ним

  • 0? ноль, если можно

  • [1-8] число от 1 до 8

  • ()$ хранит две предыдущие вещи в группе, и если конец строки не идет после этого, он может даже вернуться и вместо этого попробовать то же самое от второй до последней точки, что, как мы знаем, не является хорошей стратегией. .

Это приводит к совпадению со многими странными вещами, такими как, например, строка The number 0.1

Давайте попробуем смоделировать что-то более конкретное, если сможем:

^I-(\d{6})\.(\d{2})\.(\d{1,2})\.([1-8]{2})$

Это будет соответствовать:

  • ^I- I и дефис в начале строки

  • (\d{6}) шесть цифр, которые он хранит в группе захвата

  • \. Период. К настоящему времени, если было любое другое количество цифр, кроме шести, совпадение терпит неудачу вместо того, чтобы пытаться отследить повсюду.

  • (\d{2})\. То же самое, но две цифры вместо шести.

  • (\d{1,2})\. То же самое, запятая здесь означает, что может совпадать от одной до двух цифр.

  • ([1-8]{2}) Две цифры от 1 до 8 каждая.

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

Надеюсь, я понял, что именно вы пытаетесь сопоставить здесь. Дайте мне знать, если это не то, что вы имели в виду.

Спасибо за очень подробный ответ, я действительно очень хорошо понял ваши объяснения. Поэтому я попытался реализовать ваше решение. Это допустимые входные данные: I-001002.01.02.01 I-001015.01.02.01, но совпадение не удается, я не уверен, где

Reza 12.07.2019 19:16

Не могли бы вы привести пример строки, которая терпит неудачу?

Elizabeth 12.07.2019 19:16

И-001007.01.02.01

Reza 12.07.2019 19:19

@Reza, спасибо за примеры. Это не удается, потому что [1-8]{2} не соответствует 01. Попробуйте это, если вам нужно разрешить нули: [0-8]{2} или это, если вы можете разрешить ноль только в первой цифре, но не во второй: [0-8][1-8]

Elizabeth 12.07.2019 19:20

Большое спасибо! Это сработало, и ваше объяснение было настолько хорошим, что я понимаю регулярное выражение лучше, чем в последний день, когда пытался понять его.

Reza 12.07.2019 19:31

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

Rob Elliott 12.07.2019 21:02

Это регулярное выражение:

^.-[0-9]{6}(\.[1-8]{1,2}){3}$

подтвердит следующее:

  1. Первый символ может быть любым символом, но имеет длину 1.
  2. За ним следует тире
  3. За тире следуют ровно 6 цифр от 0 до 9. (Если это может быть меньше 6 символов, например, между 3 и 6 символами, просто замените {6} на {3,6}).
  4. Далее следуют 3 группы символов. Каждая из этих групп начинается с точки, имеет длину 1 или 2 и может быть любым числом от 1 до 8.

Пример допустимой строки:

I-587954.12.34.56

Это также справедливо:

I-587954.1.3.5

Но это не:

I-587954.12.80.356

потому что предпоследняя группа содержит 0, и потому что последняя группа имеет длину 3.

Пожалуйста, дайте мне знать, если я неправильно понял какое-либо из правил.

^I-([0-9]{1,6})\.(.{1,2})\.(0[1-2])\.(.{1,2})$

группы, разделенные . (\.) :

  1. ([0-9]{1,6}) - 1-6 цифр
  2. (.{1,2}) - 1-2 любых одиночных символа
  3. (0[1-2]) - 01 или 02
  4. (.{1,2}) - 1-2 любых одиночных символа

вы можете написать и легко протестировать регулярное выражение на своих входных данных, просто погуглите "регулярное выражение онлайн"

Другие вопросы по теме