Негативный взгляд в будущее - PullRequest
4 голосов
/ 18 мая 2010

Мне нужно выражение для захвата строки, подобной этой:

"A" [Строка, которая НЕ по крайней мере 5 и максимум 6 цифр] "B", Другими словами, захватить все, что НЕ следующее

A[0-9][0-9][0-9][0-9][0-9]B
A[0-9][0-9][0-9][0-9][0-9][0-9]B

Я пробовал негативный взгляд в будущее

regex = "a((?![0-9]{5,6}).)*d" ;

Но он не в состоянии охватить все сценарии.

Ответы [ 4 ]

6 голосов
/ 18 мая 2010
A(?!\d{5,6}B).*B

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

4 голосов
/ 18 мая 2010

Это всего лишь несколько строк действительно простого, понятного и надежного кода, который вы могли бы написать и переписать 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);

Любое «преимущество» более короткого кода полностью исключается, если его заменить легким для чтения, надежным вызовом функции.

(я полагаю, что есть хороший шанс, что это домашний вопрос, и на него НЕ следует правильно отвечать, если он есть)

3 голосов
/ 18 мая 2010

У вас почти есть это. Попробуйте вместо этого:

"A(?![0-9]{5,6}B).*B"

Обратите внимание, что ".*" будет соответствовать жадно; если есть несколько вхождений B, совпадение заканчивается последним , а не первым. Вы можете вместо этого использовать ".*?". Например, если у вас есть длинная строка с несколькими вхождениями этого шаблона, и вы используете метод find() для сканирования входной строки, вам нужно неохотно сопоставлять.

1 голос
/ 18 мая 2010

Это домашнее задание?

Я не уверен, почему в вашем регулярном выражении есть "а" и "d".

Это будет обрабатывать все от 0 до 4 цифр и 7 или более цифр.

String rexexp = "A(\\d{0,4}|\\d{7,})B";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...