Я ищу регулярное выражение GoLang RE2, которое не будет совпадать, только если пользователь введет одно из следующих, все они не должны быть чувствительны к регистру:
.i l
.i Latest
.info l
.info Latest
p!i l
p!i latest
p!info l
p!info latest
Таким образом, в каждом из этих случаев есть один префикс и один атрибут для него, если пользователь вводит только префикс без latest
или l
после него или вводит что-либо еще, кроме latest
и l
после префикса, включая любые цифры или специальные символы. . Это должно быть совпадение.
Я Джерри сфальсифицировал это регулярное выражение:
(?i)\A\.i (?:L.|[^L]+L)
Это регулярное выражение несколько работает, но оно работает только для префикса .i
и проверяет наличие L
впереди и не проверяет числа.
Я не могу обдумать, как я могу это решить.
Я бы не возражал против использования нескольких регулярных выражений, по одному для каждого префикса. Я попытался заменить \.i
другими префиксами, а часть (?:L.|[^L]+L)
словом LATEST
. Это не работает.
Спасибо за помощь : )
разве это не соответствует всему, кроме префиксов и их атрибутов? я ищу проверку, где он соответствует префиксу, только если нет атрибутов или если есть атрибут после него либо l
, либо latest
, иначе это совпадение
Возможно вот так (?i)^(?:\.|p!)i(?:nfo)?\b(?!\s+l(?:atest)?\b).*
regex101.com/r/1itPzl/1
Мне очень жаль, я извиняюсь, я использую механизм регулярных выражений GoLang RE2. Объясняет, почему ни один из них не работал. я отредактировал пост и добавил это.
Вы можете сначала сопоставить то, что вам не нужно, а затем зафиксировать в группе 1 то, что вы хотите сохранить (?i)^(?:(?:\.|p!)i(?:nfo)?\b(?: +l(?:atest)?\b).*|((?:\.|p!)i(?:nfo)?\b.*))
regex101.com/r/hfzD6j/1
этот идеально классифицирует все, что я не хочу, в группе 0. Проблема в том, что я работаю с ботом Discord, который имеет ограниченную функциональность. Это позволяет мне запускать действие только при совпадении с регулярным выражением и не позволяет ничего сверх этого. Я не особо разбираюсь в гланге или регулярных выражениях. Есть ли способ исключить все совпадения в группе 0?
Не проще ли использовать для этого switch
или if
? Или как использовать перевернутое регулярное выражение \.i l|\.i Latest|\.info l|...
, которое проверяет, является ли ввод чем-то, что не должно совпадать?
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+ пробелов и la
lat
late
lates
или 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+ раз любой символ, кроме новой строки)?
Закрыть группу без захвата и сделать ее необязательной$
Конец строки
Может
(?i)^(?!(?:\.|p!)i(?:nfo)? l).*
? См. regex101.com/r/KcWMpa/1