Регулярные выражения
- Author
- Message
-
Offline
- Posts: 512
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
-
Offline
- Posts: 1161
- Joined: Sun Oct 20, 2013 11:44 am
Возник вопрос с переворачиванием текста вида
к виду
Сделал так:
что: (\d+)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
чем: \4\3\1,\2
Оказалось, что числа могут быть отрицательными, но выражение
заработало в Notepad++ и не заработало в AkelPad. Зато заработало
А почему? Здесь же только числа в основном, жадность/сверхжадность вроде не должна иметь значение?
При этом поиск "^(-?\d+)" вполне работает.
Code: Select all
1.655 172.20.2.250
63.185 172.20.3.229
Code: Select all
172.20.2.250 1,655
172.20.3.229 63,185
что: (\d+)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
чем: \4\3\1,\2
Оказалось, что числа могут быть отрицательными, но выражение
Code: Select all
(-?\d+)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
Code: Select all
(-?\d++)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
При этом поиск "^(-?\d+)" вполне работает.
-
Offline
- Posts: 582
- Joined: Mon Apr 08, 2013 9:50 pm
- Location: Win7SP1x64, APx64
Skif_off
похоже, что употребление одной таблетки от жадности ? внутри захватывающей группы () лечит от жадности всё внутри группы, а не только ту часть, к которой относилась таблетка. Достаточно вынести таблетку за скобки, как всё снова начинает работать:
что: (-?)(\d+)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
чем: \5\4\1\2,\3
На мой взгляд, это баг.
похоже, что употребление одной таблетки от жадности ? внутри захватывающей группы () лечит от жадности всё внутри группы, а не только ту часть, к которой относилась таблетка. Достаточно вынести таблетку за скобки, как всё снова начинает работать:
что: (-?)(\d+)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
чем: \5\4\1\2,\3
На мой взгляд, это баг.
-
Offline
- Posts: 582
- Joined: Mon Apr 08, 2013 9:50 pm
- Location: Win7SP1x64, APx64
Skif_off
да, верно подмечено. Я не совсем точно выразился: жадность же бывает только у квантификаторов, а когда ? используется не после квантификатора, то он сам становится квантификатором ({0,1}).
А проблема, получается, несколько шире:
Было справдливо замечено, что ?, идущий не после квантификатора, можно заменить на {0,1}.
Получается:
и оно тоже не работает.
И если указать более широкий диапазон ({0,1} заменить на {0,5}) - то тоже ничего не работает.
да, верно подмечено. Я не совсем точно выразился: жадность же бывает только у квантификаторов, а когда ? используется не после квантификатора, то он сам становится квантификатором ({0,1}).
А проблема, получается, несколько шире:
Бага не было бы, если бы всё именно так и работало бы. А оно как раз-таки работает не так и в этом и проблема.Skif_off wrote:Раз выражение "^(-?\d+)" всё-таки работает как "^(-{0,1}\d+)", тогда да, наверное, баг.
Было справдливо замечено, что ?, идущий не после квантификатора, можно заменить на {0,1}.
Получается:
Code: Select all
(\-{0,1}\d+)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
И если указать более широкий диапазон ({0,1} заменить на {0,5}) - то тоже ничего не работает.
-
Offline
- Site Admin
- Posts: 6311
- Joined: Thu Jul 06, 2006 7:20 am
ТестоваяSkif_off wrote:заработало в Notepad++ и не заработало в AkelPad.Code: Select all
(-?\d+)\.(\d+)([ \t]+)((\d{1,3}\.){3}\d{1,3})
-
Offline
- Posts: 1161
- Joined: Sun Oct 20, 2013 11:44 am
В параллелной теме возник вопрос, полез ради любопытства и сломал голову. Например, как найти любое из чисел
Почему не находятся так:
? Захватывается только первая буква из двух.
Можно попробовать так
но найдутся и ошибочные "uu" и "ll".
-------------------
Instructor
Прошу прощения, сливал с телефона, потом забыл отписаться
?128u
1024UL
1L
8Lu
Почему не находятся так:
Code: Select all
[0-9]+(ul|lu|u|l)
Можно попробовать так
Code: Select all
[0-9]+[ul]{1,2}
-------------------
Instructor
Прошу прощения, сливал с телефона, потом забыл отписаться
-
Offline
- Posts: 512
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Попробуйте так:Skif_off wrote: Почему не находятся так:? Захватывается только первая буква из двух.Code: Select all
[0-9]+(ul|lu|u|l)
Code: Select all
[0-9]+(?>ul|lu|u|l)
-
Offline
- Posts: 512
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Здесь просто нет перебора вариантов (вернее он есть, но только вперед), поэтому удобнее использовать для данного случая, но, кстати, есть некоторая вероятность ошибки при поиске шаблона, которая исключается при использовании "\b":Skif_off wrote:YuS
Спасибо, так работает. А ведь таблицу в руководстве сначала прочитал
т.к. \b - граница слова, то вариант:Skif_off wrote: Serge Yolkin
Можно поподробнее? С \b были неожиданности, привык обходиться без.
Code: Select all
[0-9]+(?:ul|lu|u|l)\b
Так тоже можно использовать:
Code: Select all
[0-9]+(?>ul|lu|u|l)\b
-
Offline
- Posts: 1161
- Joined: Sun Oct 20, 2013 11:44 am
Подскажите, пожалуйста, что не так с выражением
? Нужно найти строки вида "path\name-x64.exe", но не срабатывает ни в 4.9.6, ни в тестовой, зато срабатывает
разве что-то изменилось в поддержке регэкспов? Или туплю?
Добавлено:
Похоже, туплю - тут правильнее сделать нежадным "+?"?
Code: Select all
^[^\r\n]++x64\.exe$
Code: Select all
^[^\r\n]+x64\.exe$
Добавлено:
Похоже, туплю - тут правильнее сделать нежадным "+?"?
-
Offline
- Posts: 512
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
сверхжадный шаблон захватывает максимально возможное количество символов и ничего уже не отдает, т.е. перебор вариантов отсутствует. В данном случае, шаблонSkif_off wrote:Подскажите, пожалуйста, что не так с выражением? Нужно найти строки вида "path\name-x64.exe", но не срабатывает ни в 4.9.6, ни в тестовой, зато срабатываетCode: Select all
^[^\r\n]++x64\.exe$
разве что-то изменилось в поддержке регэкспов?Code: Select all
^[^\r\n]+x64\.exe$
Code: Select all
^[^\r\n]++
Жадный шаблон, захватывает максимально возможное количество символов, но с перебором вариантов, т.е. вот такая строка:
Code: Select all
abc path\name-x64.exe def path\name-x64.exe
Code: Select all
abc path\name-x64.exe def path\name-x64.exe abcf
А чтобы работал "ленивый" шаблон, необходимо убрать из выражения символ конца строки "$":Skif_off wrote: тут правильнее сделать нежадным "+?"?
Code: Select all
^[^\r\n]+?x64\.exe
Code: Select all
abc path\name-x64.exe def path\name-x64.exe abcf
Code: Select all
abc path\name-x64.exe