Regex для сопоставления строки, содержащей два (или более) слова в любом порядке и без учета регистра - PullRequest
0 голосов
/ 27 ноября 2018

Надеюсь, вы, ребята, можете мне помочь.

Мне нужно создать строку, которая предупреждает меня, когда выполняются следующие условия:

  1. В сообщении указывается два (или более) слова
  2. Это делаетнужно смотреть не только на «целые» слова, но и на те, которые содержат текст, который я ищу.Для istance, я ищу «error», он должен предупреждать меня также, когда находит «error s » или «errorless».
  3. Он не должен быть чувствительным к регистру
  4. Он должен смотреть на word1 и word2, но также наоборот, другими словами, он должен смотреть на них независимо от их порядка

Я играл некоторое время с regex101, но я не былв состоянии выполнить все условия (условие № 4 все еще отсутствует).

Вы можете найти по следующей ссылке, что я смог сделать: https://regex101.com/r/Z4cE9A/5

Обратите внимание, что мне нужны совпадениясо следующими характеристиками выражений:

Аромат: golang / Flag: одна строка

Важное примечание : я не могу использовать символ "|"поскольку она не работает должным образом в системе, где я собираюсь использовать эту строку.

Любая помощь будет более чем признательна.Заранее спасибо за вашу поддержку.

РЕДАКТИРОВАТЬ: Я сделал путаницу.Не функционирующий символ - «|».Однако, если возможно, лучше избегать и "/", так как я не уверен, работает ли он.Если вы хотите, мы можем предоставить мне две строки, одну без символа «/» и одну без, если она не работает.

1 Ответ

0 голосов
/ 27 ноября 2018

Это должно делать то, что вы хотите:

(?i:(http)|(error))

Вы можете заменить http и error на любые другие ключевые слова, которые вы ищете.

Для этого на Голанге:

package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    keywords := []string{
        "error",
        "http",
    }
    p := "(?i:(" + strings.Join(keywords, ")|(") + "))"
    text := `
    Gran Turismo Sport

Shipment Error

Attempt
https://
`
    re := regexp.MustCompile(p)
    fmt.Println(re.MatchString(text))
}

Вы можете проверить это на игровой площадке Golang:

https://play.golang.org/p/XOhNVBCh8Pt

РЕДАКТИРОВАТЬ:

На основании нового ограничения невозможностичтобы использовать символ |, я бы посоветовал вам выполнить поиск следующим образом:

(?i:(error)?(http)?)

Это всегда будет возвращать true (или список пустых строк в find all), кромеХорошо, что вы можете отфильтровать все пустые строки, и в результате вы получите желаемый результат.

Вот пример этой работы на игровой площадке Golang:

https://play.golang.org/p/miVC0hdLtQc

РЕДАКТИРОВАТЬ 2: Если вы хотите убедиться, что ВСЕ ключевые слова находятся в тексте, измените ? в регулярном выражении с {1,}.Также вам больше не нужен цикл.

(?i:(error){1,}(http){1,})

Это пример работы на игровой площадке Golang

https://play.golang.org/p/f9eFcvObDsA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...