Объединение 3 регулярных выражений для проверки слагов/URL-адресов

Я пытаюсь объединить несколько рабочих шаблонов RegEx вместе (И их). Я не думаю, что делаю это правильно, кроме того, первое регулярное выражение может мешать следующим двум.

Пример слага (без специальных символов, кроме - и _):

(^[a-z0-9-_]+$)

Затем я хотел бы убедиться, что первый символ НЕ - или _:

(^[^-_])

Затем я хотел бы убедиться, что последний символ НЕ - или _:

([^-_]$)

Совпадение (хороший псевдоним):

  • моя-новая_страница
  • имя страницы

Несоответствие (плохой псевдоним)

  • -моя-новая-страница
  • моя-новая-страница_
  • !@#$%^&*()

Если это RegExp можно упростить, и я более чем счастлив его использовать. Я пытаюсь создать проверку URL-адреса страницы, который может предоставить пользователь, я ищу, чтобы пользователь:

  • Не запускается или и со специальным символом
  • Начинайте и заканчивайте цифрой или буквой
  • середина (не начало и конец) может включать - и _

Один из них, который у меня работает, я могу настроить для других персонажей по мере необходимости.

В конце концов, я применяю Annotation к своей модели так:

[RegularExpression(
    @"(^[a-z0-9-_]+$)?(^[^-_])?([^-_]$)", 
    ErrorMessage = "Alias is not valid")
]

Спасибо, и дайте мне знать, если я должен предоставить больше информации.


person Derek    schedule 15.03.2018    source источник
comment
Если вам нужна простая среда для тестирования регулярного выражения, RegExr вполне подойдет, существует множество других подобных инструментов. . К сожалению, я довольно плохо разбираюсь в регулярных выражениях вручную и обычно не замечаю, насколько они тяжелы.   -  person Antry    schedule 15.03.2018
comment
@Antry regexstorm.net/tester для .net   -  person ctwheels    schedule 15.03.2018


Ответы (1)


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

^[a-z\d](?:[a-z\d_-]*[a-z\d])?$
  • ^ Займите позицию в начале строки
  • [a-z\d] Совпадение с любой строчной буквой или цифрой ASCII
  • (?:[a-z\d_-]*[a-z\d])? Optionally match the following
    • [a-z\d_-]* Match any character in the set any number of times
    • [a-z\d] Совпадение с любой строчной буквой или цифрой ASCII
  • $ Займите позицию в конце строки

See code in use здесь

с помощью системы; используя System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        Regex regex = new Regex(@"^[a-z\d](?:[a-z\d_-]*[a-z\d])?$");
        string[] strings = {"my-new_page", "pagename", "-my-new-page", "my-new-page_", "!@#$%^&*()"};

        foreach(string s in strings) {
                if (regex.IsMatch(s))
                {
                    Console.WriteLine(s);
                }
        }
    }
}

Результат (только положительные совпадения):

my-new_page
pagename
person ctwheels    schedule 15.03.2018
comment
Спасибо, я вижу, что неправильно подходил к этому, когда пытался взять разные RegEx и объединить их вместе. Мне нужно будет изучить каждый раздел, например, я пока не совсем понимаю Non-capturing group. - person Derek; 15.03.2018
comment
@Derek, группа без захвата просто используется для группировки частей шаблона. Она идентична группе захвата, за исключением того, что все, что ей соответствует, не захватывается в выходных данных. - person ctwheels; 15.03.2018