Отрицательное предпросмотр регулярного выражения

Я пытаюсь сделать отрицательный взгляд на запрос эластичного поиска, регулярное выражение:

(?!.*charge)(?!.*encode)(?!.*relate).*night.*

текст, с которым я сопоставляю:

возвращен на ночь, все еще возникают проблемы со строительством. вызывает проблемы со здоровьем из-за распыления химического вещества и вызывает раздражение глаз.

Мне не повезло. Может кто-нибудь помочь?

ES запрос:

  "query": {
    "filtered": {
      "query": {
        "bool": {
          "must_not": [
            {
              "regexp": {
                "message": {
                  "value": "(?!.*charge)(?!.*encode)(?!.*relate).*night.*",
                  "flags_value": 65535
                }
              }
            }
          ]
        }
      },
      "filter": {
        "match": {
          "resNb": {
            "query": "462031152161",
            "type": "boolean"
          }
        }
      }
    }
  }
 Wiktor Stribiżew29 июл. 2016 г., 20:41
Хорошо, пишу это, держись
 Federico Piazza28 июл. 2016 г., 23:19
@ReginaldoSoares, насколько я знаю, lookbehind не поддерживает переменную длину.
 nicael28 июл. 2016 г., 22:05
Каковы ожидаемые матчи? ..
 Reginaldo Soares28 июл. 2016 г., 22:26
@nicael текстовое сообщение должно быть, так как у меня есть «ночной» матч и ни одна из групп негативов.
 Sam28 июл. 2016 г., 22:40
Но ваша проблема, вероятно, в том, чтоmessage анализируется, и слова не совсем так, как ожидалось. У меня было много проблем с этим в один момент, когда я оценивал комбинированный ПК (#-#) и анализатор разбивал его на куски (# а также#) так что мое регулярное выражение (ищет-) не будет соответствовать.
 Wiktor Stribiżew29 июл. 2016 г., 11:08
Пожалуйста, проверьте мой предложенный шаблон и дайте мне знать, если они работают, чтобы я мог объяснить в ответ, как они работают.
 Sam28 июл. 2016 г., 22:39
Вероятно, будет более эффективно использовать логический запрос, который ищетnight и неcharge/encode/relate.
 Reginaldo Soares29 июл. 2016 г., 20:24
@ WiktorStribiżew большое спасибо, что это сработало, пожалуйста, разместите объяснение.
 Bryce Drew28 июл. 2016 г., 22:38
(Я не знаю эластичного поиска) Если вы делаете ночь группой захвата, это работает?(?!.*charge)(?!.*encode)(?!.*relate)(.*night.*)
 Wiktor Stribiżew28 июл. 2016 г., 23:36
Пытаться"value": "~(charge|encode|relate)night~(charge|encode|relate)", "flags" : "ALL", Или же.*night.*&~.*(charge|encode|relate).*

Ответы на вопрос(2)

Решение Вопроса
Решение

Вы можете решить эту проблему с помощью одного из двух:

"value": "~(charge|encode|relate)night~(charge|encode|relate)",

или же

.*night.*&~(.*(charge|encode|relate).*)

С дополнительным (так как он включенпо умолчанию)

"flags" : "ALL"
Как это работает?

В обычных регулярных выражениях NFA у вас обычно есть отрицательные обходные пути, которые помогают ограничить более общий шаблон (те, которые выглядят как(?!...) или же(?<!...)). Однако в ElasticSearch вам нужно использовать определенныедополнительные операторы.

~ (тильда) этодополнение это * используется для отрицания атома сразу после него. Атом - это либо отдельный символ, либо группа подшаблонов / альтернатив внутри группы.

Обратите внимание, что по умолчанию все шаблоны ES привязаны в начале и конце строки, вам никогда не нужно использовать^ а также$ распространены в Perl-подобных и .NET, и других NFA.

Таким образом,

~(charge|encode|relate) - соответствует любому тексту с начала строки, кромеcharge, encode а такжеrelatenight - соответствует словуnight~(charge|encode|relate) - соответствует любому тексту, кроме любой из 3 подстрок, до конца строки.

В регулярных выражениях NFA, таких как Perl, вы можете написать этот шаблон, используязакаленный жадный жетон:

/^(?:(?!charge|encode|relate).)*night(?:(?!charge|encode|relate).)*$/

Второй шаблон более сложный: обычные регулярные выражения NFA обычно не переходят из одного места в другое при сопоставлении, поэтому обычно используются предпросмотры, закрепленные в начале текста. Здесь, используяINTERSECTION мы можем просто использовать 2 шаблона, где один будет соответствовать строкеа также второй также должен соответствовать строке.

.*night.* - соответствовать всей строке (как. соответствует любому символу, кроме новой строки, в противном случае используйте(.|\n)*) сnight в этом& - а также~(.*(charge|encode|relate).*) - линия, которой нетcharge, encode а такжеrelate подстроки в нем.

NFA Perl-подобное регулярное выражение будет выглядеть

/^(?!.*(charge|encode|relate)).*night.*$/
 zubug5512 авг. 2018 г., 11:23
Вы можете помочь с этим вопросом ->stackoverflow.com/questions/51783196/...
 zubug5512 авг. 2018 г., 11:09
Вы можете помочь с этим вопросом ->stackoverflow.com/questions/51783196/...

Вы не использовалиякорь для ваших предвкушений. Попробуйте использовать «^» в начале шаблона, и он должен работать.

 Wiktor Stribiżew29 июл. 2016 г., 09:51
Elasticsearch регулярные выражения всегда якоря,^ а также$ не являются частью синтаксиса регулярных выражений ES

Ваш ответ на вопрос