Почему этот позитивный взгляд назад не работает?

У меня есть эта строка (это просто вырезанная часть большей строки):

00777: 50.000 bit/s

и хочу захватить часть 50 000 бит / с, я создал регулярное выражение с положительным обзором, например:

(?<=\d{5}: )\S+\s+\S+

Что работает, но когда между : и числом больше пробелов, это не так, как и ожидалось.

Итак, я сделал это:

(?<=\d{5}:\s+)\S+\s+\S+

Но это не работает?! Почему? Даже это выражение не соответствует ни одной строке:

(?<=\d{0,5}).*

Что мне здесь не хватает?


person esper    schedule 06.08.2013    source источник
comment
Разве это не позитивный взгляд позади?   -  person Ibrahim Najjar    schedule 06.08.2013
comment
(?<=...) положительный взгляд сзади. Некоторые механизмы регулярных выражений не поддерживают (положительный/отрицательный) взгляд назад.   -  person falsetru    schedule 06.08.2013
comment
Во-первых, вы используете положительный взгляд назад, а не взгляд вперед. Во-вторых, существует очень мало движков регулярных выражений, которые поддерживают ретроспективные выражения переменной длины. Какой из них вы используете?   -  person Rohit Jain    schedule 06.08.2013
comment
ты прав - есть!   -  person esper    schedule 06.08.2013
comment
Для тестирования я использую gskinner.com/RegExr, но я хочу, чтобы это было реализовано на Java.   -  person esper    schedule 06.08.2013
comment
@esper, Java поддерживает просмотр назад переменной длины, а ваш тестовый сайт - нет.   -  person Qtax    schedule 06.08.2013
comment
@Qtax. Нет, Java не поддерживает поисковые запросы переменной длины.   -  person Rohit Jain    schedule 06.08.2013


Ответы (2)


Это связано с тем, что многие механизмы регулярных выражений не поддерживают квантификаторы (+,*,?) в ретроспективном просмотре.

Пример:java,javascript

ИЗМЕНИТЬ

Поскольку вы используете Java, вы можете использовать группу

Matcher m=Pattern.compile("\\d{5}:\\s+(\\S+\\s+\\S+)").matcher(input);
if(m.find())
  value=m.group(1);
person Anirudha    schedule 06.08.2013
comment
На самом деле, вы ответили на него первой строкой. Код Java — это просто вишенка наверху - person esper; 06.08.2013

В первом вы можете использовать переменное количество пробелов с (?<=\d{5}: +), но, как и в другом ответе, это может не поддерживаться вашим механизмом регулярных выражений.

Последнее выражение не соответствует ни одной строке из-за . в данных, оно не является частью класса \d char, вы можете использовать [\d\.]

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

Если вы ожидаете, что единица всегда будет после числа, которое вам нужно, и это всегда будет bit/s, нет причин не включать его как литерал в ваше регулярное выражение:

[\d\.]+ bit/s$

Затем вы можете начать превращать его в более сложное выражение, если обнаружите исключения в своих данных, например единицу с кбит/с:

(<value>[\d\.]+) *(<unit>\w+)/s$

Использование именованных групп захвата, чтобы было проще и читабельнее ссылаться на них позже, чтобы можно было умножить значение по единице и т.д.

Резюме: не используйте более сложные функции, если они вам не нужны.

person paolobueno    schedule 06.08.2013