Это всего лишь несколько строк действительно простого, понятного и надежного кода, который вы могли бы написать и переписать 3 раза в том количестве времени, которое требуется для публикации и получения ответа на версию RE. (И, конечно, с версией RE не будет очевидно, что вы делаете).
int examine(String s) {
int foundAt=-1;
for(int i=0;i<s.length;i++) {
char c=s.charAt(i); // something like that
if(c=='A') {
foundAt=i;
continue;
}
if(foundAt != -1) {
if(c == 'B' && i-foundAt < 5 || i-foundAt > 6)
return foundAt;
if(!String.isNumber(c)) // something like that
foundAt = -1; // Not a number before B, reset
}
}
return -1;
}
Хорошо, так что это немного больше, чем несколько строк (но он обернут в вызове функции тоже), но изменения поведения, чтобы сделать что-то хитрое более прямой, чем модификации RE, где изменения могут легко нести непреднамеренные последствия, это должно быть тривиально читать, и как только первые несколько простых ошибок будут уничтожены, он будет надежным - что-то, что, похоже, никогда не будет верно для регулярных выражений.
Итак, разве это не так коротким и читаемым, как вы собираетесь получить?
n=examine(s);
Любое «преимущество» более короткого кода полностью исключается, если заменяется легко читаемый, надежный вызов функции.
(я полагаю, есть хороший шанс, что это домашнее задание вопрос, и это не должно правильно ответить на него, если он есть)
Что такое 'a' и' d' в ваших примерах? Вы не пытаетесь сопоставить «A» и «B»? – erickson