2010-05-18 3 views
4

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

[Строка, которая НЕ по крайней мере 5 и atmost 6 цифр] «A» «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" ;

Но он не может захватить все сценарии.

+1

Что такое 'a' и' d' в ваших примерах? Вы не пытаетесь сопоставить «A» и «B»? – erickson

ответ

4

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

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

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

+1

Это ужасная идея, ничуть не более ясная или более очевидная или более легкая в изменении. Как показали другие респонденты, модификация была тривиальной. Для соответствия шаблону регулярное выражение является правильным инструментом, и если данный случай неясен, две строки документации (пример соответствия, исключение примера) лучше, чем двадцать строк неправильного направления. –

1

Является ли это домашнее задание вопрос?

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

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

String rexexp = "A(\\d{0,4}|\\d{7,})B"; 
+1

Вы предполагаете, что между 'A' и' B' могут быть только цифры. То, как я его читаю, может быть что угодно, но вопрос не так уж ясен. –

3

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

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

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

6
A(?!\d{5,6}B).*B 

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

+0

+1. И тем, кто говорит, что это невозможно прочитать, пожалуйста, найдите время, чтобы узнать КАК прочитать его. – polygenelubricants

Смежные вопросы