Регулярное выражение, которое совпадает только тогда, когда были найдены 4 определенных слова

#javascript #regex

Вопрос:

Как говорится в заголовке, мне нужно регулярное выражение, чтобы проверить, есть ли в строке эти четыре слова (Обновить, Откат, Пропустить, Не сейчас), и возвращать их только в том случае, если все они присутствуют, если нет, это ничего не возвращает.

Вот пример: {"Update":"iVBORw0KGgo","Rollback":"iVBORw0KGgo","Skip":"iVBORw0KGgo","Not Now":"iVBORw0KGgo"}

В этом случае он должен вернуться [Обновление, Откат, Пропустить, Не сейчас]

{"Update":"iVBORw0KGgo","Skip":"iVBORw0KGgo","Not Now":"iVBORw0KGgo"}

В этом случае он не должен возвращать никакого значения

Я пытался создать его сам, но мои знания о регулярном выражении очень просты: (Update|Rollback|Skip|Not Now)

Заранее спасибо!


Редактировать

Я заметил, что регулярное выражение может быть не лучшим способом достичь этого.

Комментарии:

1. Имеет ли значение порядок слов?

2. Нет, порядок не имеет значения, он просто должен соответствовать чему-либо, если найдено 4, и ничего, если отсутствует 1.

Ответ №1:

Используйте это:

 ^(?=.*"Update"s*:)(?=.*"Rollback"s*:)(?=.*"Skip"s*:)(?=.*"Not Now"s*:)
 

(?=...) это означает, что если вы посмотрите в оба, то обнаружите эту закономерность.

Таким образом, пустое совпадение вернется, как только мы найдем все эти 4 шаблона.

ДЕМОНСТРАЦИЯ

Ответ №2:

В качестве альтернативы регулярному выражению вы можете использовать JSON.parse для разбора строки в объект и Object.keys получения свойств:

 const str = `{"Update":"iVBORw0KGgo","Rollback":"iVBORw0KGgo","Skip":"iVBORw0KGgo","Not Now":"iVBORw0KGgo"}`;

const keys = Object.keys(JSON.parse(str))

const result = keys.sort().toString() == "Not Now,Rollback,Skip,Update" ? keys : "";

console.log(result) 

Комментарии:

1. В вопросе не указано, что все четыре «ключа» должны присутствовать в строке, поэтому, возможно, что-то вроде (псевдокод) (["Update", "Rollback", "Skip", "Not Now"] - keys).empty? ?....

2. @CarySwoveland Я могу ошибаться, но моя интерпретация поста ОП такова, что он есть. «возвращайте их только в том случае, если они все присутствуют, если нет, это ничего не вернет».

3. Да, но не keys.sort().toString() == "Not Now,Rollback,Skip,Update" произойдет ли сбой, если хэш содержит эти четыре ключа, но также и другие ключи? Я не знаю Javascript, но ваше заявление кажется довольно ясным.

Ответ №3:

Хотя регулярные выражения явно не являются хорошим инструментом для этой работы, вы можете сделать что-то вроде этого:

 re.match("(?=.*Update.*)(?=.*Skip.*)",string)
 

"(?=WORD)" соответствует, если выражение следует за ним, но не использует какую-либо строку.

Конечно, заполните регулярное выражение всеми 4 словами, которые вы хотите аналогичным образом.

Также обратите внимание, что регулярное выражение само по себе ничего не возвращает. Для этого вам нужно написать код.

Комментарии:

1. Тег-это Javascript, а не Python. В (?=.*Update.*) должно быть (?=.*"Update") (трейлинг .* не влияет).