#regex #format
#регулярное выражение #формат
Вопрос:
У меня есть регулярное выражение, которое мне нужно реализовать. Правила таковы
2 digits followed by
2 .. or 2 -- or 2 __ followed by 2 digits
it cannot be empty
it cannot have only one pair (i.e. 01)
The string can be up to 1000 characters in length.
i.e.,
01..02--03 or
01..01 or
01--02--03--04--05..06 and so on
Комментарии:
1. @Все… спасибо за отличные ответы… Я их тестирую. Я скоро опубликую подтверждение
2. Строка — по крайней мере, в большинстве контекстов и применений, с которыми мы сталкиваемся, — не может быть бесконечной длины. (И в тех немногих контекстах, где это возможно, я не знаю ни одного механизма регулярных выражений, который мог бы обрабатывать бесконечную строку 😉 .) Я предполагаю, что вы имеете в виду, что строка состоит из любого количества пар цифр (может ли она быть пустой? может ли быть только одна пара? вы должны указать это, если хотите получить точный ответ), разделенный на .. или на — или на __ .
3. @Tom … спасибо, что разъяснил мне. Да, «бесконечный» был плохим выбором слов. Это может быть до 1000 символов. Он не может быть пустым, он не может иметь только одну пару (т.Е. 01)
Ответ №1:
Вот как я бы это сделал:
d{2}(?:(?:[.]{2}|-{2}|_{2})d{2})
Объяснение: две цифры, за которыми следует одно или несколько вхождений двух одинаковых символов, состоящих из точки, дефиса или подчеркивания, за которыми следуют еще две цифры.
Если вам нужно закрепить это, вы можете добавить a ^
в начале и a $
в конце.
Причина, по которой я предпочитаю использовать {2}
вместо написания (т. Е. Повторения одного и того же символа), заключается в том, что это позволяет увеличить число. По мере увеличения числа подсчет количества повторяющихся символов будет становиться все сложнее и сложнее.
Кроме того, в зависимости от вашего шрифта и размера экрана некоторые символы могут визуально сливаться в один более длинный символ, что затрудняет определение их последовательности. Символ undexcore является ярким примером этого, рассмотрим: _____
Сколько это подчеркиваний? Сравните и сравните это с этим выражением: _{5}
Комментарии:
1. это сработало. я принимаю из-за объяснения. Спасибо
2. Хороший ответ, но выражению действительно нужны привязки начала
^
и конца строки$
, чтобы гарантировать совпадение всей строки. В противном случае это будет ошибочно соответствовать:"12--34-56789...ABC^#@%$^#$"
.3. Я попробовал ошибочную строку, и она не совпала. Я думаю, что выражение в порядке.
Ответ №2:
Это должно сработать:
^(?:d{2}(?:--|..|__)) d{2}$
- С начала строки выполните следующие действия:
- Найдите 2 цифры
- Далее следует
--
или..
или__
- Повторите шаги 2 и 3 столько раз, сколько возможно
- Убедитесь, что оно заканчивается 2 цифрами
Комментарии:
1. это допустимое значение 01 должно быть не менее 01 ..01. спасибо за ответ
2. @Marcus… Мой плохой, я забыл упомянуть об этом в исходном сообщении. еще раз спасибо … из любопытства. Как вы это поняли? генератор или просто знания?
3. @MikeTWebb Я составил «руководство» для того, что было необходимо (5 шагов, упомянутых в ответе). Затем я перевел каждую часть отдельно и, наконец, собрал все это вместе. Когда все было на месте, я добавил
?:
в каждую группу, поскольку нет необходимости фиксировать содержимое в группах.
Ответ №3:
^dd((?:..|--|__)dd) $
Вот ваше регулярное выражение.
Ответ №4:
Проверено на Regexpal.com:
(d{2}(.{2}|-{2}|_{2})) d{2}
Это не позволит использовать такие числа, как 01.-02