Ответы пользователя по тегу Регулярные выражения
  • Как написать регулярное выражение?

    erge
    @erge
    Примус починяю
    какой ЯП?
    можно находить блоки <a>...</a>
    а уже внутри них искать блоки <b>...</b>

    одной регуляркой, это......... м...

    одной регуляркой даже скорее невозможно, только если знать точное количество блоков <b>...</b>
    или точнее... хотя бы максимальное их количество...

    например максимум их может быть 4, тогда можно написать регулярку вида:
    (?<=<a>)(\s*?<b>([^<]+)<\/b>)(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?


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

    см, regex101

    PS:
    можно было бы и так... (?<=<a>)(\s*?<b>([^<]+)<\/b>){1,}
    матчиться оно будет, НО, вот группа будет только одна и писаться в нее будет последнее найденное значение.

    как-то так....

    UPDATE
    взяв сгенерированный код в python с regex101, допиливаем "решение в лоб"

    regex = r"(?<=<a>)(\s*?<b>([^<]+)<\/b>)(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?(\s*?<b>([^<]+)<\/b>)?"
    
    test_str = '''
    <a>
    <b>test11</b>
    </a>
    
    <a>
    <b>test21</b>
    <b>test22</b>
    </a>
    
    <a>
    <b>test31</b>
    <b>test32</b>
    <b>test33</b>
    </a>
    
    <a>
    <b>test41</b>
    <b>test42</b>
    <b>test43</b>
    <b>test44</b>
    </a>
    
    <c>
    <b>test51</b>
    <b>test52</b>
    </c>
    '''
    
    matches = re.finditer(regex, test_str, re.MULTILINE)
    
    for matchNum, match in enumerate(matches, start=1):
        for groupNum in range(0, len(match.groups())):
            groupNum = groupNum + 1
            if (groupNum % 2 == 0) & (match.group(groupNum) != None):
                print (match.group(groupNum) )


    см. пример
    Ответ написан
    Комментировать
  • Как заменить двойные кавычки на "?

    erge
    @erge
    Примус починяю
    Нужно сначала разбить текст на группы attribute_name="attribute_value" затем для этих групп вызвать замену и это можно сделать при помощи preg_replace_callback

    регулярка для поиска ([^= ]+)="(.*?)"\s+(?=([^= ]+=|\/>))
    см. RegEx101

    используем ее в preg_replace_callback, находим пары атрибут=значение и заменяем , делая подмену символов в значении через htmlspecialchars

    $str = '
    <order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />
       <order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />
     <order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />
          <order acode="7102774" ProductName="Какой-то текст "с скобочками", которые нужно заменть" ClientBarCode="" />';
    
    $out = preg_replace_callback(
        '/([^= ]+)="(.*?)"\s+(?=([^= ]+=|\/>))/',
        function($m) {
            return $m[1].'="'.htmlspecialchars($m[2], ENT_QUOTES).'" ';
        },
        $str);
        
    echo $out;


    см. пример
    Ответ написан
    Комментировать
  • Как прописать регулярное выражение для замены в Notepad++?

    erge
    @erge
    Примус починяю
    поиск ^(\s*?\$[^=]+=\s*explode.*?)\);$
    замена \1 ?? '');

    см. пример

    UPDATE
    поиск ^(\s*?\$[^=]+= *explode.*?)\);
    см. пример

    UPDATE2
    сделать такое....
    поиск ^(\s*?\$[^=]+= *explode.*?)(\);)
    замена \1 ?? ''\2
    Ответ написан
  • Как удалить повторяющиеся строки с IP более N раз?

    erge
    @erge
    Примус починяю
    UPDATE:
    Через регулярку можно, если предварительно отсортировать строки

    В Notepad++ есть следующие операции:

    Сортировка:
    выбрать в меню
    En - Edit -> Line Operations -> Sort Lines Lexicographically Ascending
    Ru - Правка -> Операции со Строками -> Сортировка по возрастанию (По первой цифре)

    Удаление дубликатов:
    выбрать в меню
    En - Edit -> Line Operations -> Remove Consecutive Duplicate Lines
    Ru - Правка -> Операции со Строками -> Удалить последовательные дубликаты строк


    Через регулярку - сначала сортируем список (как описано выше), затем делаем замену через регулярку:
    Найти: (\d+\.\d+\.\d+\.\d+:\d+[\r\n]*)(?:\1)+
    Заменить на: \1

    Это удалит все дубликаты
    см. пример на regex101

    Если необходимо N-раз, то
    Найти: (\d+\.\d+\.\d+\.\d+:\d+[\r\n]*)(?:\1){2,}
    Заменить на: \1

    где цифра в фигурных скобах = N-1
    см. пример на regex101

    см. так же Регулярные выражения в Notepad++ готовые примеры, и т.п. в гуглояндексе...

    так же удаление дубликатов можно сделать через варианты:
    • в Notepad++сначала сортируем все строки, затем удаляем дубликаты, см. выше пункты меню
    • в bash сделать
      cat ip.lst | sort | uniq

    • использовать MS Excel (LibreOffice и т.п.), см. Yandex - Excel удалить дубликаты

    Ответ написан
  • PHP как правильно написать регулярное выражение для обработки url?

    erge
    @erge
    Примус починяю
    https:\/\/site.ru\/[A-Z0-9]{8}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{12}\/$


    пример на regex101
    Ответ написан
    Комментировать
  • Какая нужна регулярка чтобы проверка проходила на номера одного оператора?

    erge
    @erge
    Примус починяю
    Вот еще вариант, проверяет номер написанный в любом формате со скобками вокруг кода и без с пробелами и с тире и с + в начале и без

    var str = '90553334849';
    alert(/^\+?9[ -]?\(?05[58]\)?[ -]?\d{3}[ -]?\d{2}[ -]?\d{2}$/.test(str));


    UPD:
    вот проверка (одной регуляркой в одну строку) по массиву кодов

    var str = '9(055)3334849';
    var allow = ['055','058'];
    alert((new RegExp('^\\+?9[ -]?\\(?('+allow.join('|')+')\\)?[ -]?\\d{3}[ -]?\\d{2}[ -]?\\d{2}$')).test(str));


    UPD3:
    Почитайте: https://developer.mozilla.org/en-US/docs/Web/JavaS...
    в разделе "Special characters in regular expressions." расписаны все спецсимволы, которые используются в регулярных выражениях.
    про конструктор new RegExp там тоже есть...

    кокретно в последнем примере:
    т.к. регулярку нам надо создавать "динамически", то используется конструктор new RegExp , который из строки создает и возвращает регулярку и уже у нее вызывается метод .test()
    про строку - в строке спецсимволы \ необходимо экранировать (предварять) символом \
    в строку регулярки мы вставляем все коды из массива allow склеенные через символ |
    регулярка вида (одно|второе|третье) читается как одно ИЛИ второе ИЛИ третье
    в данном случае массив склеивается и реглярка читается как 055 или 058

    ну, как-то так... )
    Ответ написан
    Комментировать
  • Как в регулярном выражении исключить слова JS?

    erge
    @erge
    Примус починяю
    Имхо, желательно делать проверку полнее, т.к. ну чисто теоретически такие слова могут быть в имени пользователя например, так же не делать инверсию результата, т.к. метод все же называется isInvalid

    isInvalid: function(input) {
      return /@(gmail|yahoo)\.[a-z]+$/.test(input.value.trim().toLowerCase());
    }


    PS: если проверка НА валидность, то поставить !
    Ответ написан
    2 комментария
  • Как перенести часть строки в notepad ++?

    erge
    @erge
    Примус починяю
    Найти: ([A-ZА-ЯЁ][^A-ZА-ЯЁ]+)
    Заменить: $1\n
    включить - "Match case" и "Regular expression"
    см. рис. ниже:
    2VtED9xl.png

    PS: См. регулярный выражения notepad++
    Ответ написан
    Комментировать
  • Можно ли написать регулярку, которая будет проверять, закрыта ли кавычка (двойная и (или) одинарная) в случае, если вообще она (кавычка) есть?

    erge
    @erge
    Примус починяю
    я так понимаю что вопрос у вас поставлен неверно, если - "Моя задача - удалить переменные из кода."
    и судя по тексту -
    "которая будет проверять, закрыта ли кавычка (двойная и (или) одинарная)"
    "Точка с запятой может ведь быть частью значения переменной (если переменная хранит строку). "
    удалять вы собираетесь все строковые переменные?

    тогда вам необходимо матчить (находить) строковые переменные, а не проверять есть ли , нет кавычки и пр. Вопрос некорректно поставлен!?

    вот регулярка, матчит строковые переменные как начинающиеся, так и без модификаторов (можете добавить свои по вкусу), в данном случае это модификаторы JavaScript const, var, let:
    ((const|var|let)\s+)?([\w]+)\s*=\s*("[^"]+");?


    PS: работает в NotePad++
    то что попадает внутрь () запоминается в переменные \1 \2 \3 \4
    \3 - название переменной
    \4 - собственно сама строка

    Upd:
    выше написал пример с двойными кавычками "
    для апострофов проще сделать такую же регулярку заменив в регулярке выше двойные на апострофы и использовать два регулярных выражения, чем городить и пытаться все сделать на одной регулярке.
    ведь если строка в апострофах, то внутри свободно могут быть кавычки двойные, в этом случае...... думаю регулярку то можно написать, но уж сильно сложнее и запутаннее будет.

    Upd2:
    хотя нет, не сильно сложнее :)
    ((const|var|let)\s+)?([\w]+)\s*=\s*("[^"]+"|'[^']+');?


    Upd3:
    если в конце всегда будет ; и перенос строки
    то можно так:
    ((const|var|let)\s+)?([\w]+)\s*=\s*(".*"|'.*');$
    Ответ написан
    3 комментария