Я создаю строковый шаблон в С#
(?:^|/|-(?!tg|tog))(\w+-)?(tg|tog)(\d+)(?:$|#|\?)
где это работает, как я и ожидал
/path/name-tg1 : output: group[2]=tg, group[3]=1
/path/tog2 : output: group[2]=tog, group[3]=2
/tg3 : output: group[2]=tg, group[3]=3
/nametog2 : output: not match
прямо сейчас я хочу изменить шаблон там, где ожидаю
-tog4 : output: group[2]=tog, group[3]=4
/path#/tog4 : output: not match
/pa$th/tog4 : output: not match
/path./tog4 : output: not match
/p?ath/tog4 : output: not match
/#tg4 : output: not match
это означает, что принудительно разрешается использовать только символы [a-z] или [0..9] или '/', '-' или '_' перед ключевым словом "tg" или "tog" могу ли я узнать, как изменить приведенный выше шаблон регулярного выражения
Пожалуйста, объясните, чего вы хотите, вместо того, чтобы позволять нам делать выводы из множества примеров. Действительно сложно вывести все правила из примеров.
Хотя ваши вопросы кажутся двусмысленными, но я думаю, вы ищете это
^[a-z0-9/\-_]+(?:tg|tog)|(\d+)$
если мы возьмем ваше утверждение «применять только разрешенные символы [a-z] или [0..9] или '/', '-' или '_' перед ключевым словом «tg» или «tog»»
это не работает, когда я набираю: /path/tog2, группа[1] равна 2. но другой группы нет, а затем я набираю /pathtog2, я ожидал не совпадения, но у меня есть возвращаемое значение
Попробуй это:
(^[a-z0-9/\-_]+)(tg|tog)(\d+)$
Первая пара круглых скобок не обязательна, но благодаря ей ожидаемый результат попадает в группы 2 и 3.
Вы можете использовать
^(?:[\w/]*/)?(\w*-)?(to?g)(\d+)$
Шаблон соответствует:
^
Начало строки(?:[\w/]*/)?
При желании сопоставьте символы слова или /
, а затем сопоставьте /
(\w*-)?
При необходимости захватите необязательные символы слов, за которыми следует -
в группе 1.(to?g)
Захватите группу 2, сопоставьте tg
или tog
(\d+)
Захватите группу 3, сопоставьте 1+ цифры$
Конец строкиДемонстрация регулярных выражений
Или, возможно, другой вариант: начать строку с -
ИЛИ /
, а затем необязательные повторы символов a-z, за которыми следует /
.
^(?:-|/(?:[a-z]+/)*)(\w+-)?(to?g)(\d+)$
Демонстрация регулярных выражений
Это похоже на решение. Пожалуйста, также объясните свое регулярное выражение.
@ArvindKumarAvinash Я добавил разбивку шаблона.
@Thefourthbird, если [a-z] разрешает только a-z, могу ли я использовать \S, но исключить символ с помощью $,#, . как изменить, но часть входного значения кодирует URL-адрес, например 20%, и я не хочу слишком усложнять проверку или декодировать URL-адрес и проверять
@CarrieKaski Вместо [a-z]
вы можете использовать ^(?:-|/(?:[^\s$#.?]+/)*)(\w+-)?(to?g)(\d+)$
, см. regex101.com/r/CVCwRn/1
Я думаю, что регулярное выражение - это слишком много и очень медленно для задачи, которую вы хотите.