Поиск прямого слэша в регэкспе

Здесь можно сообщить о найденных багах в Far.
Post Reply
buniak_a_h
Posts: 1128
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 48 times
Contact:

Поиск прямого слэша в регэкспе

Post by buniak_a_h » Sun 29 Sep, 2019 08:14

Здравствуйте.
Мне кажется, я столкнулся со "странностью". Хочется найти строку вида nnn / nnn, где nnn - любые числа; между ними и дробной чертой (прямым слэшом) могут быть пробелы. Пишу образец:
\d+\s*/\s*\d+
Поиск в lfSearch и RESearch прекрасно справляются с этой задачей. А встроенный поиск (с [x] Regular expressions) приводит к ошибке:

Code: Select all

╔═══════════ Error ═══════════╗
║ Invalid options combination ║
║ /\d+\s*/\s*\d+/             ║
║          ↑                  ║
╟─────────────────────────────╢
║           { OK }            ║
╚═════════════════════════════╝
Также к ошибке приводит вызов в макросе regex.match("123 / 456", "\d+\s*/\s*\d+").
Опытным путём выяснил, что ошибка обходится экранированием слэша обратным слэшом. Мне не лениво, но выглядит всё равно как баг. Хотя бы в хелпе, в описании регулярного выражения для поиска надо бы отметить такую особенность...

siberia-man
Posts: 98
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Поиск прямого слэша в регэкспе

Post by siberia-man » Sun 29 Sep, 2019 08:48

Следующие символы имеют особое значение в регекспах, поэтому их требуется экранировать, в зависимости от реализации механизма регэкспов

Code: Select all

. * ? ( ) { } [ ] / | \ + ^ $
Last edited by siberia-man on Sun 29 Sep, 2019 08:49, edited 1 time in total.

buniak_a_h
Posts: 1128
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 48 times
Contact:

Поиск прямого слэша в регэкспе

Post by buniak_a_h » Sun 29 Sep, 2019 09:10

siberia-man wrote:
Sun 29 Sep, 2019 08:48
Следующие символы имеют особое значение в регекспах, поэтому их требуется экранировать, в зависимости от реализации механизма регэкспов

Code: Select all

. * ? ( ) { } [ ] / | \ + ^ $
Извините, как-то пролетело мимо... :facepalm: В хелпе же ясно написано:
все слеши (и прямые, и обратные) в вашем регулярном выражении должны писаться со спецсимволом
Просто это - неожиданно... Я раньше много дел имел с PERL-овскими регэкспами, и прямой слэш экранирования не требовал. Ну просто он - не спец. символ (а если спец.символ, то что он означает? Я не нашёл...). Хелп по регэкспам я, конечно, не читал, т.к. сам писал когда-то анализатор и правила знал...
Впрочем, я понял... Слэш экранируется, чтоб отличить от "окаймляющих", видимо. Типа для повышения эффективности парсинга
Last edited by buniak_a_h on Sun 29 Sep, 2019 09:12, edited 1 time in total.

siberia-man
Posts: 98
Joined: Sat 28 Jun, 2014 23:07
Has thanked: 1 time
Been thanked: 3 times

Поиск прямого слэша в регэкспе

Post by siberia-man » Sun 29 Sep, 2019 10:18

buniak_a_h wrote:
Sun 29 Sep, 2019 09:10
Я раньше много дел имел с PERL-овскими регэкспами, и прямой слэш экранирования не требовал
buniak_a_h wrote:
Sun 29 Sep, 2019 09:10
Впрочем, я понял... Слэш экранируется, чтоб отличить от "окаймляющих", видимо
Все верно. Например,

Это читать приятнее

Code: Select all

if ( m|^http://| ) { ...
чем это

Code: Select all

if ( m/^http:\/\// ) {...
Скорее всего Вы имели дело с вариантом, похожим на первый, более приятный

buniak_a_h
Posts: 1128
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 48 times
Contact:

Поиск прямого слэша в регэкспе

Post by buniak_a_h » Sun 29 Sep, 2019 10:49

В том алгоритме, что я когда-то делал, было просто: если первый символ - слэш, то после последнего - параметры. А сам образец - между слэшами. И внутри образца уже можно не экранировать. Вроде, логично. Но если не считать, что слэш в 1-й позиции - точно служебный и не "лезть" сразу в конец, а обрабатывать паттерн последовательно, то надо знать, что он кончается. И признаком этого будет неэкранированный слэш. Не смертельно. Просто надо запомнить... Всё же это требование - излишнее по сравнению со стандартом.
Странно, что и lfSearch, и RESearch не требуют... А вот древний S&R (Search_and_Replace) тоже требует... Разные библиотеки?

Shmuel
Posts: 5900
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 23 times
Been thanked: 223 times

Поиск прямого слэша в регэкспе

Post by Shmuel » Sun 29 Sep, 2019 10:52

buniak_a_h wrote:
Sun 29 Sep, 2019 10:49
Странно, что и lfSearch, и RESearch не требуют...
Если в LF Search выбрана библиотека "Far regex", то будет требовать.

buniak_a_h
Posts: 1128
Joined: Sat 20 Apr, 2013 00:17
Location: Питер
Has thanked: 82 times
Been thanked: 48 times
Contact:

Поиск прямого слэша в регэкспе

Post by buniak_a_h » Sun 29 Sep, 2019 11:55

Shmuel wrote:
Sun 29 Sep, 2019 10:52
Если в LF Search выбрана библиотека "Far regex", то будет требовать.
Не! Не FAR regex! PCRE!
Я, честно говоря, думал, что эта самая Far regex - это LUA-выражения (с процентами в качестве Escape-символов). Сколько лет пользуюсь ФАРом, а ни разу не пробовал - вроде, необходимости не было :)

Post Reply

Return to “Глюки и баги”