#regex
#регулярное выражение
Вопрос:
Как я могу написать регулярное выражение, которое соответствует, если текст имеет только один тип буквы? Пример: «KKKKK», «AAAAA», «BBBB», «CCCC»
Комментарии:
1. Какой язык / инструмент вы используете? Поддерживает ли он обратные ссылки в регулярном выражении?
2.
/^([a-zA-Z])1*$/
… для сопоставления слов установите границу слова/b([a-zA-Z])1*b/
3. якоря забыты.
Ответ №1:
Вы можете сделать это с помощью групп и обратных ссылок.
Мои примеры приведены в диалоге регулярных выражений Java, но вы можете адаптировать его к любому диалекту, который поддерживает обратные ссылки. Например, некоторые движки нуждаются (...)
вместо (...)
.
Сначала вам нужна группа, которую вы обозначаете, заключая в круглые скобки:
(.)
Это соответствует любому отдельному символу. Если вы хотите, чтобы это были буквы в верхнем регистре, вы могли бы использовать (A-Z)
вместо этого.
Затем вам нужно сопоставить второй символ, который совпадает с содержимым группы. Вы можете ссылаться на содержимое первого совпадения, используя 1
:
(.)1
Это будет соответствовать AA
или BB
, но нет AB
. И нет A
, поскольку второй символ является обязательным.
Далее вам нужно указать, что второй символ встречается любое количество раз, включая ноль. С этим покончено *
.
(.)1*
Это соответствует A
, B
, AA
, BB
, , AAA
, BBBBBBB
но не AB
или AAB
.
В Java
это должно быть экранировано:
Pattern pattern = Pattern.compile("(.)\1*");
Ваш движок регулярных выражений может:
— используйте это для поиска во входной строке части, которая соответствует (так BAAAAB
соответствует — находит AAAA
)
— или может потребоваться, чтобы вся строка соответствовала шаблону (поэтому BAAAAB
не совпадает).
Если вам нужно второе поведение от движка, который выполняет первое, добавьте .*
любую сторону шаблона.
Если вам нужно первое поведение от движка, который выполняет второе, добавьте ^
в начале и $
в конце шаблона, они соответствуют началу и концу строки соответственно.