Регулярное выражение для игнорирования нескольких префиксов и сопоставления только в том случае, если у них нет одного или двух конкретных жестко запрограммированных атрибутов?

Я ищу регулярное выражение GoLang RE2, которое не будет совпадать, только если пользователь введет одно из следующих, все они не должны быть чувствительны к регистру:

.i l.i Latest.info l.info Latestp!i lp!i latestp!info lp!info latest

Таким образом, в каждом из этих случаев есть один префикс и один атрибут для него, если пользователь вводит только префикс без latest или l после него или вводит что-либо еще, кроме latest и l после префикса, включая любые цифры или специальные символы. . Это должно быть совпадение.

Я Джерри сфальсифицировал это регулярное выражение: (?i)\A\.i (?:L.|[^L]+L)

Это регулярное выражение несколько работает, но оно работает только для префикса .i и проверяет наличие L впереди и не проверяет числа. Я не могу обдумать, как я могу это решить. Я бы не возражал против использования нескольких регулярных выражений, по одному для каждого префикса. Я попытался заменить \.i другими префиксами, а часть (?:L.|[^L]+L) словом LATEST. Это не работает.

Спасибо за помощь : )

Может (?i)^(?!(?:\.|p!)i(?:nfo)? l).*? См. regex101.com/r/KcWMpa/1

Wiktor Stribiżew 10.12.2020 10:39

разве это не соответствует всему, кроме префиксов и их атрибутов? я ищу проверку, где он соответствует префиксу, только если нет атрибутов или если есть атрибут после него либо l, либо latest, иначе это совпадение

Zer0 10.12.2020 10:49

Возможно вот так (?i)^(?:\.|p!)i(?:nfo)?\b(?!\s+l(?:atest)?\b).*regex101.com/r/1itPzl/1

The fourth bird 10.12.2020 10:54

Мне очень жаль, я извиняюсь, я использую механизм регулярных выражений GoLang RE2. Объясняет, почему ни один из них не работал. я отредактировал пост и добавил это.

Zer0 10.12.2020 11:14

Вы можете сначала сопоставить то, что вам не нужно, а затем зафиксировать в группе 1 то, что вы хотите сохранить (?i)^(?:(?:\.|p!)i(?:nfo)?\b(?: +l(?:atest)?\b).*|((?:\.|p!)i(?:nfo)?\b.*))regex101.com/r/hfzD6j/1

The fourth bird 10.12.2020 11:19

этот идеально классифицирует все, что я не хочу, в группе 0. Проблема в том, что я работаю с ботом Discord, который имеет ограниченную функциональность. Это позволяет мне запускать действие только при совпадении с регулярным выражением и не позволяет ничего сверх этого. Я не особо разбираюсь в гланге или регулярных выражениях. Есть ли способ исключить все совпадения в группе 0?

Zer0 10.12.2020 11:26

Не проще ли использовать для этого switch или if? Или как использовать перевернутое регулярное выражение \.i l|\.i Latest|\.info l|..., которое проверяет, является ли ввод чем-то, что не должно совпадать?

Good Night Nerd Pride 10.12.2020 19:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
487
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Go не поддерживает обходы. В этом случае вы можете указать, что вы позволите сопоставить.

В этом случае вы разрешаете любой из префиксов, за которым необязательно следует «слово», отличное от «l» или «последний».

Один из вариантов может быть

(?i)^(?:\.|p!)i(?:nfo)?\b(?:(?: +(?:la(?:t(?:e(?:s(?:t\S)?)?)?)?)| +(?:[^\sl]\S*|l[^\sa]\S*|la[^\st]\S*|lat[^\se]\S*|late[^\ss]\S*|lates[^\st]|latest\S+))(?: +.*)?)?$

По частям

  • (?i) Модификатор без учета регистра
  • ^ Начало строки
  • (?:\.|p!)i Совпадение .i или p!i
  • (?:nfo)?\b При желании найдите nfo, за которым следует граница слова
  • (?: Группа без захвата
    • (?: Группа без захвата
      • +(?:la(?:t(?:e(?:s(?:t\S)?)?)?)?) Сопоставьте 1+ пробелов и lalatlatelates или latest (за которыми следует хотя бы один символ без пробелов для последнего)
      • | Или
      • +(?:[^\sl]\S*|l[^\sa]\S*|la[^\st]\S*|lat[^\se]\S*|late[^\ss]\S*|lates[^\st]|latest\S+) Соответствует 1+ пробелам, за которыми следуют 6 вариантов, которые могут начинаться с одного и того же слова, исключая 1 символ (также исключая символ пробела, используя \s), или сопоставлять слово, за которым следует хотя бы один символ пробела.
    • ) Закрыть группу без захвата
    • (?: +.*)? При желании можно сопоставить 1+ пробелов и 0+ раз любой символ, кроме новой строки
  • )? Закрыть группу без захвата и сделать ее необязательной
  • $ Конец строки

Демонстрация регулярных выражений

Другие вопросы по теме