Мне трудно группировать части регулярного выражения. Я хочу проверить несколько вещей в строке следующего формата: I-XXXXXX.XX.XX.XX
Убедитесь, что первый набор из 6 X (I-xxxxxx.XX.XX.XX) не содержит символов и его длина не превышает 6.
Убедитесь, что третий набор 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; }
Я просто не могу понять, как настроить таргетинг на определенные части строки. Любая помощь будет принята с благодарностью и заранее благодарна!
Я немного запутался в правилах - можете ли вы привести несколько примеров допустимых и недопустимых строк?
Имея дело с регулярным выражением, вы должны быть осторожны, чтобы не создать выражение, которое соответствует вашим примерам, но достаточно свободно, чтобы соответствовать недопустимым. Таким образом, вам нужно быть очень конкретным в определении того, что должно и не должно совпадать, желательно с примерами.





У вас возникли проблемы с добавлением новой проверки в эту строку, потому что она очень общая. Давайте посмотрим, что вы делаете:
^.+\.(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, но совпадение не удается, я не уверен, где
Не могли бы вы привести пример строки, которая терпит неудачу?
И-001007.01.02.01
@Reza, спасибо за примеры. Это не удается, потому что [1-8]{2} не соответствует 01. Попробуйте это, если вам нужно разрешить нули: [0-8]{2} или это, если вы можете разрешить ноль только в первой цифре, но не во второй: [0-8][1-8]
Большое спасибо! Это сработало, и ваше объяснение было настолько хорошим, что я понимаю регулярное выражение лучше, чем в последний день, когда пытался понять его.
@Reza, если это отвечает на ваш вопрос, вы должны отметить его принятым зеленой галочкой. Это поможет другим пользователям, у которых может возникнуть аналогичный вопрос.
Это регулярное выражение:
^.-[0-9]{6}(\.[1-8]{1,2}){3}$
подтвердит следующее:
{6} на {3,6}).Пример допустимой строки:
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})$
группы, разделенные . (\.) :
вы можете написать и легко протестировать регулярное выражение на своих входных данных, просто погуглите "регулярное выражение онлайн"
Используйте разделение на '.' символ и выполнять отдельные строки. Или используйте группировку и проверьте совпадение по группам.