За последние 24 часа нас посетили 22019 программистов и 1003 робота. Сейчас ищут 712 программистов ...

Отрицани группы символов

Тема в разделе "Регулярные выражения", создана пользователем miltorg, 20 фев 2020.

  1. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Пример:

    $_='CAPTION_1_MAKET
    CAPTION_1_DATE';

    Нужно удалить всё после второго подчёркивания. Решений куча. Одно из них:

    /[^_]+$/g

    Но у меня например, в начале, очень быстро написалось:

    /.*_/g

    Но к нему нужно применить отрицание.

    Как? Спасибо.

    Интересует именно регулярное выражение!
     
  2. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Отрицание... - как то я тут не совсем верно сказал.
    Попытаюсь ещё раз. Этот шаблон правильный:
    /.*_/g

    Но взять нужно не его, а всё что осталось в строке.
    Не CAPTION_1_ , а MAKET
     
  3. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    PHP:
    1. <?php
    2.  
    3. $_ ='CAPTION_1_MAKET
    4. CAPTION_1_DATE
    5. CAPTION_2_TEST
    6. CAPTION_2_BEST
    7. CAPTION_44444_LAST';
    8.  
    9. $match = test( $_ );
    10.  
    11. print_r( $match );
    12.  
    13. function test( $text )
    14. {
    15.     $str = $text . "\r\n";
    16.     preg_match_all('/_([^0-9_]+)\r\n/', $str, $data);
    17.    
    18.     if ( !empty( $data[1] ) )
    19.     {
    20.         return $data[1];
    21.     }
    22.  
    23.     return false;
    24. }
     
  4. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    @Artur_hopf, я не просил решение. Я спрашивал:

    Этот шаблон правильный:
    /.*_/g

    Но взять нужно не его, а всё что осталось в строке.
    Не CAPTION_1_ , а MAKET

    Интересует именно регулярное выражение!
     
  5. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    /.*_\K.*/g
    Или
    /.*_(.*)/g
     
    miltorg нравится это.
  6. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Вы опять ищите решение задачи. Задача решена. Давно. Она приведена для примера.

    Этот шаблон правильный:
    /.*_/g

    Но взять нужно не его, а всё что осталось в строке.
    Не CAPTION_1_ , а MAKET

    Интересует именно регулярное выражение!

    Псевдокод:

    /!=(.*_)/ - то есть находим регулярное выражение, но берём не его, а всё кроме него.
    --- Добавлено ---
    А что такое \К ?
     
  7. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну так замени все что попадает в шаблон на пустую строку, останется то что в него не входит.
    в чем проблема то?
     
  8. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    проблема в том, что на пустую строку, в данном примере, как раз нужно заменять то, что не попадает в шаблон.

    Псевдокод, Перл:

    s/!=(.*_)//g
    --- Добавлено ---
    Похоже что того что я хочу - нет. Возможно потому, что на перле для этого есть например такое:

    @_=/.*_/g;

    В PHP, вероятно что тоже есть решение на уровне функций обрабатывающих результаты шаблонов
    --- Добавлено ---
    Изначально я хотел этого (псевдокод):

    preg_replace('/!=(.*_)/', '', $str);
     
  9. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    Упс. Спасибо огромное!
     
  10. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    В Перле есть &' - всё после совпадения
    В php такого нет?