Найти совпадение, но оно не должно входить в диапазон между знаками

Тема в разделе "Регулярные выражения", создана пользователем RedRabbit, 11 янв 2016.

Модераторы: xpert13
  1. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    608
    Симпатии:
    251
    Здравствуйте, не пойму как составить регулярное выражение. Нужно найти совпадение, но оно не должно входить в диапазон между символами {}. Мне нужно найти Hello, но оно не должно находиться в пределах {..произвольный текст..}
    Найти: Hello
    Текст:
    {Hello world} Hello Mark! {bred Hello Tod} Bred Bred {bred bred Hello Silvia}
     
    Последнее редактирование: 11 янв 2016
  2. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    251
    RedRabbit нравится это.
  3. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    608
    Симпатии:
    251
    Хм. Но данное регулярное выражение находит не только Hello , но символы рядом с Hello. Пробелы и другие знаки :(

    Код:
    {Hello world} Hello Mark! {Hello Tod} Bred Bred {Hello Silvia} 
    Код:
    (?i)[^{](hello mark)[^}]
    Код:
     Hello Mark!
    Тестировал в ZennoPoster
     
  4. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    251
    [14-19] `Hello` нет только hello. Ты посмотри что в переменной print_r($result); Наверняка в $result[1] находится то что тебе надо.
     
  5. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    229
    Симпатии:
    308
    Пропускать содержимое {...} можно например так
    https://regex101.com/r/nG6xB8/2
     
    RedRabbit нравится это.
  6. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    608
    Симпатии:
    251
    Все бы хорошо, но не находит вообще:(
    Может использовать не pcrePHP, а JavaScript, там я уж как-нибудь выкручусь:)

    Код:
    var    str = "{Hello world} Hello Mark! {bred Hello Tod} Hello Bred Bred {bred bred Hello Silvia}";
    var res = str.replace(/\G(?:[^{H]+|\{.*?\}|(?!hello).)+.\Khello/i, "XXX"); 
     
  7. lag

    lag

    Регистр.:
    13 окт 2014
    Сообщения:
    229
    Симпатии:
    308
    А можно глянуть код который используете для поиска. Может в регулярке недостает скобок вокруг последнего \K(hello).

    Конструкция str.replace(/\G(?:[^{H]+|\{.*?\}|(?!hello).)+.\Khello/i, "XXX") не сработает т.к. в JavaScript нет метасимовов \G \K.
     
  8. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    608
    Симпатии:
    251
    Да нету кода:) Это ZennoPoster
    Но там можно использовать JavaScript, а какой язык использует ZennoPoster при замене или поиске с рег. выражениями я до сих пор не пойму. NET наверное:)
     
    Последнее редактирование: 11 янв 2016
  9. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    251
    если такое сработало более менее
    Код:
    (?i)[^{](hello mark)[^}]
    попробуй добавить в [^] неугодные символы.
    Код:
    (?i)[^{\s]hello mark[^\s!}]
     
  10. RedRabbit

    RedRabbit

    Регистр.:
    11 июл 2008
    Сообщения:
    608
    Симпатии:
    251
    Последнее редактирование: 11 янв 2016