2013-10-12 2 views
1

У меня есть текст с некоторыми линиями (200+) в следующем формате:Как совместить это выражение с регулярным выражением?

10684 - The jackpot ? discuss Lev 3 --- ? --- 

10755 - Garbage Heap ? discuss Lev 5 --- ? --- 

Я Hant получить первый номер (10684 или 10755), только если число после «Лева» больше, чем 3. I 'm можно получить первое число с этим регулярным выражением: ([0-9]+) -, но без ограничений уровня.

Как это можно сделать?

Заранее спасибо.

+1

Я не думаю, что эта задача подходит для RegExp tho ugh ... Это число после Лев всегда меньше 10? –

+0

Да, это так. Извините, забыл упомянуть об этом. –

ответ

1

Регулярные выражения не распознают числа как числа (только строки). Вы можете сделать это, хотя:

([0-9]+) - .*Lev (?:[4-9][^0-9]|[1-9][0-9]+) 

В основном, мы используем чера оператора (|) принимать только одну цифры больше, чем 3 (насильственному проверяя, что следующего характера является не цифры) или многозначное число, не начинающееся с нуля.

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

([0-9]+) - .*Lev (?:[4-9](?:[^0-9]|$)|[1-9][0-9]+) 

(я предполагаю, что все, что движок регулярных выражений вы используете не может справиться с lookaround утверждения. в будущем, пытаются всегда включать какой язык вы используете, когда вы задаете регулярное выражение вопрос.)


Ах, я только что прочитал вашу правку, что число всегда меньше 10. Ну , это намного проще:

([0-9]+) - .*Lev [4-9] 
3

(\d+) - .*?Lev (?:[4-9]|[1-9]\d+)

Первый \d+ матчи номер строки, как вы сделали.

Следующий .*? - ленивый квантификатор, который не будет потреблять слишком много символов. И следующее выражение направит его в нужное место. (ленивый квантификатор, как правило, более эффективен)

Вторая скобка, (?:[4-9]|[1-9]\d+), соответствует либо одиночным цифровым номерам более 3 или двух цифровых чисел без начального нуля.

Удостоверьтесь, что в стеке не отображается изображение. Возьмите эту ссылку: http://regexr.com?36n5l

Пример вывода:

enter image description here

+0

На самом деле, ваше решение чище, чем мое. Я был укушен ошибкой «забыл-проверить цифры-то-последую» столько раз, что я автоматически проверю, но любое число, начинающееся с '[4-9]', обязательно больше 3, поэтому нет нужно для моего '[^ 0-9]'. +1. –

+0

+1 для размещения http://gskinner.com/RegExr/ –

+0

Не забудьте про '04'? – pguardiario

0

опережения действительно самое лучшее, потому что он оставит только номер:

/\d+(?=.*Lev (0*[4-9]|[1-9]\d))/ 
+0

Да. И вы можете сократить свое решение до '/\d+(?=.*Lev [4-9]) /' – EverythingRightPlace

+0

Только если мы предположим <10 – pguardiario

+0

См. Информацию по комментариям :) – EverythingRightPlace

0

Немного Awk обмане:

awk -F '\? +discuss +Lev' '$2>3 { split($1,a,/ */); print a[1] }' file 
Смежные вопросы