Я начинаю с 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})
Я знаю, что не подхожу к правильному ответу, чему я учусь. Если бы кто-то мог помочь мне, я был бы очень признателен.
Используйте \b
для сопоставления только слов и обратных ссылок для каждого |
,
\b([B-Z])\1A|([B-Z])A\2|A([B-Z])\3\b
Проверьте: https://regexr.com/42bp0
([BZ])\1{2}
самом деле ссылаются на 3 из того же символа, потому что ([BZ])
уже ссылается на один, в то время как \1{2}
ссылаются на еще 2 ,
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\$"
[AZ]{2}
будет соответствоватьAB
,AZ
и любым другим 2-символьным регулярным выражениям, и я не вижу хорошего способа выразить «одну и ту же букву из этого набора повторяющихся», кроме какA{2}A | B{2}A | C{2}A
т. Д. Или использование групп захвата с обратными ссылками.