RegEx два одинаковых символа в строке

2

Я начинаю с RegEx, и мне нужна помощь, я хочу подтвердить, что есть два одинаковых символа, за которыми следует A, или что они разделены (но остаются неизменными) и в середине A. Я объясняю на примерах:

BBA -> true
ABB -> true
BAB -> true
CCA -> true
ABC -> false
BAC -> false
BBBA -> false (there have to be only two)
ABBB -> false (there have to be only two)

На данный момент у меня что-то похожее на это, но это не работает правильно:

(([B-Z])\1{2}A) | ([B-Z]{1}A[B-Z]{1}) | (A([B-Z])\1{2})

Я знаю, что не подхожу к правильному ответу, чему я учусь. Если бы кто-то мог помочь мне, я был бы очень признателен.

  • 0
    В общем, вам, вероятно, нужно изучить обратные ссылки и то, как их использовать с группами захвата, чтобы вы могли сопоставить символ в зависимости от захваченного в данный момент символа: stackoverflow.com/questions/21428545/… Проблема в вашем случае, например, [AZ]{2} будет соответствовать AB , AZ и любым другим 2-символьным регулярным выражениям, и я не вижу хорошего способа выразить «одну и ту же букву из этого набора повторяющихся», кроме как A{2}A | B{2}A | C{2}A т. Д. Или использование групп захвата с обратными ссылками.
  • 1
    Но я бы не стал решать такую проблему с помощью регулярных выражений, она становится слишком сложной и хрупкой. Извлеките 2 первые буквы в регулярном выражении, а затем проверьте, одинаковы ли они в Java.
Показать ещё 1 комментарий
Теги:

2 ответа

1

Используйте \b для сопоставления только слов и обратных ссылок для каждого | ,

\b([B-Z])\1A|([B-Z])A\2|A([B-Z])\3\b

Проверьте: https://regexr.com/42bp0

  • 1
    Большое спасибо, очень, очень большое! Работает отлично! Я думал о том, как решить это часами. Теперь мне нужно понять, как это работает, и продолжать учиться. Еще раз большое спасибо!
  • 0
    Единственная ошибка, которую я замечаю в вашем регулярном выражении, это ([BZ])\1{2} самом деле ссылаются на 3 из того же символа, потому что ([BZ]) уже ссылается на один, в то время как \1{2} ссылаются на еще 2 ,
0
Pattern pattern = Pattern.compile("([B-Z])\\1A|A([B-Z])\\2|([B-Z])A\\3")

обратные ссылки проходят через весь шаблон и пересекают оператор ИЛИ. В целом это не очень подходит для решения регулярных выражений, хотя, как уже упоминалось.

Обратите внимание, что вам нужно добавить ^ и $ по мере необходимости, чтобы соответствовать только этому шаблону, например так:

"^([B-Z])\\1A\$|^A([B-Z])\\2\$|^([B-Z])A\\3\$"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню