Как пользоваться регулярками в басе?



  • В коде:

    [[WORD]] = 'word';
    re = new RegExp('(?<![a-z])' + [[WORD]] + '(?![a-z])', 'gi');
    log('notreplaceword wordnotreplace, replace: word 1word word2 word, $word word?'.replace(re, 'new_word'));
    SyntaxError: Invalid regular expression: unrecognized character after (? во время выполнения действия 136939356
    

    В ноде:

    [[WORD]] = 'word';
    re = new RegExp('(?<![a-z])' + [[WORD]] + '(?![a-z])', 'gi');
    console.log('notreplaceword wordnotreplace, replace: word 1word word2 word, $word word?'.replace(re, 'new_word'));
    SyntaxError: Invalid regular expression: /(?<![a-z])word(?![a-z])/: Invalid group
    

    Регулярка рабочая.



  • @Mic Проблема в регулярке, у тебя даже тут не выделяет результат https://regex101.com/r/haZ6k7/2
    Что тебе нужно спарсить?
    Пример ([0-9|word|0-9]+)
    alt text



  • @m1st Как это не выделяет? Перейдите по моей ссылке (https://regex101.com/r/haZ6k7/2) и увидите что она выделяет как раз то, что нужно, слово, которое не окружено текстом:
    1883d18f-5eff-4b9b-8d50-bdf8740c69de-image.png



  • @Mic said in Как пользоваться регулярками в басе?:

    @m1st Как это не выделяет? Перейдите по моей ссылке (https://regex101.com/r/haZ6k7/2) и увидите что она выделяет как раз то, что нужно, слово, которое не окружено текстом:
    1883d18f-5eff-4b9b-8d50-bdf8740c69de-image.png

    Вы перейдите в Firefox и обнаружите, что ваша регулярка вообще ошибочна

    19ddd359-0e15-4218-9b33-381a29828fee-изображение.png



  • @Fox said in Как пользоваться регулярками в басе?:

    Вы перейдите в Firefox и обнаружите, что ваша регулярка вообще ошибочна

    Это видимо Firefox не поддерживает Negative Lookbehind. В Chrome все работает. Можно сделать чтобы в БАСе это тоже заработало?



  • @Mic said in Как пользоваться регулярками в басе?:

    @Fox said in Как пользоваться регулярками в басе?:

    Вы перейдите в Firefox и обнаружите, что ваша регулярка вообще ошибочна

    Это видимо Firefox не поддерживает Negative Lookbehind. В Chrome все работает. Можно сделать чтобы в БАСе это тоже заработало?

    Скажите, вы сами создавали эту регулярку или использовали конструктор?



  • @Fox said in Как пользоваться регулярками в басе?:

    Скажите, вы сами создавали эту регулярку или использовали конструктор?

    Сам, я не знаю что вы имеете ввиду под словом конструктор.



  • @Mic said in Как пользоваться регулярками в басе?:

    @Fox said in Как пользоваться регулярками в басе?:

    Скажите, вы сами создавали эту регулярку или использовали конструктор?

    Сам, я не знаю что вы имеете ввиду под словом конструктор.

    Конструктор в моём понимании, это любая программа, в которой вы указываете какие данные меняются, а какие остаются и она выдаёт вам готовую регулярку.



  • @Fox said in Как пользоваться регулярками в басе?:

    Конструктор в моём понимании, это любая программа, в которой вы указываете какие данные меняются, а какие остаются и она выдаёт вам готовую регулярку.

    Нет, я открыл regex101.com и написал все что мне надо: слово, которое не окружено текстом, указанным в квадратных скобочках. Вроде ничего супер сложного, самая простая регулярка.
    78a6f996-da0e-447b-8309-9d4829efda17-image.png
    Как такое в БАС повторить?



  • @Mic said in Как пользоваться регулярками в басе?:

    Нет, я открыл regex101.com и написал все что мне надо: слово, которое не окружено текстом, указанным в квадратных скобочках. Вроде ничего супер сложного, самая простая регулярка.

    Это из если не ошибся из версии 2018 года и не поддерживается движком js который есть в БАС и даже версией node.js, которая в него встроена.

    Но ваше выражение прекрасно работает через встроенный кубик2020-06-17_152049.png



  • @UserTrue ООО, класс! Спасибо. Я уж думал придется опять что-то через питон колхозить.



  • Не понял только как в кубике ключи gmi указывать? Особенно нужен i, чтобы для заглавных тоже работало.



  • Нашел альтернативу, которая в коде работает:

    [[A]] = 'notreplaceword wordnotreplace, replace: Word 3wOrd worD4 word 1word word2 3Word WORD4 word,5worD worD6; $word word? WorD';
    log([[A]]);
    log([[A]].replace(/(^|[^a-z])word(?![a-z])/gi, "$1w'ord"));
    
    notreplaceword wordnotreplace, replace: Word 3wOrd worD4 word 1word word2 3Word WORD4 word,5worD worD6; $word word? WorD
    notreplaceword wordnotreplace, replace: w'ord 3w'ord w'ord4 w'ord 1w'ord w'ord2 3w'ord w'ord4 w'ord,5w'ord w'ord6; $w'ord w'ord? w'ord
    

    Но все равно интересно, неужели кубик Заменить строку не поддерживает case insensitive? Пересмотрел весь форум, нашел слова разработчика про этот кубик, но там ничего не сказано про case insensitive.

    @support said in Не работает регулярка в БАС:

    @Gang Обновил модуль регулярных выражений.

    Перевел движок с js на с++, это означает, что теперь регулярки поддерживают lookbehind, unicodeproperties и многое другое.
    Если говорить просто, то регулярные выражения теперь можно копировать с другого софта без доработки.

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

    Действие Извлечь все данные может получать конкретную группу, для этого ей нужно присвоить имя result.

    Появилось действие Заменить строку через регулярки.

    К каждому действию добавлены примеры и описание.

    Новую версию модуля можно попробовать скачав по ссылке RegularExpression.zip или подождав новую версию БАС.



  • @Mic said in Как пользоваться регулярками в басе?:

    Не понял только как в кубике ключи gmi указывать? Особенно нужен i, чтобы для заглавных тоже работало.

    Флаг "g" по всей видимости и так включен, а "i" видимо не как. Можно или переписать на альтернативный вариант как у вас выше. Или накостылить вроде такого

    (?<![a-z])(word|Word|WORD)(?![a-z])
    


  • @UserTrue said in Как пользоваться регулярками в басе?:

    Или накостылить

    Вот только я обрадовался что в БАСе по человечески сделали регулярки...
    Да не, ну не верю я, что про i могли забыть. Скорее всего как-то можно, просто мы не знаем как.



  • @Mic said in Как пользоваться регулярками в басе?:

    ну не верю я, что про i могли забыть.

    Да легко xD



  • (?i) в начале выражения включает case insensitive



  • @Vituskosoy said in Как пользоваться регулярками в басе?:

    (?i) в начале выражения включает case insensitive

    Добавьте эту строчку в подсказку внутри кубика.


Log in to reply