Как создать (C #) правила регулярных выражений - PullRequest
0 голосов
/ 11 февраля 2012

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

  • Не иметь заглавных букв.
  • Начните с буквы.
  • Иметь по крайней мере 1 цифру (ы) не в начале и в конце.
  • До 8 буквенно-цифровых символов
  • НЕ содержит никаких символов, таких как символы @ # $ (символы, такие как! @ # $% ^ & * () - +).

Ответы [ 4 ]

2 голосов
/ 11 февраля 2012

РЕДАКТИРОВАТЬ: Я обновил регулярное выражение в коде с тем, которое выглядит для работы.

@"^[a-z](?=[a-z0-9@#\$]*[0-9][a-z0-9@#\$]*)[a-z0-9@#\$]{0,6}[a-z@#\$]$"

РЕДАКТИРОВАТЬ : Я подправил кодОдин из тестов был помечен как aa1@aaaa как ожидаемый, что он потерпит неудачу, когда он будет успешным, как указал Дуглас.

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


Не ответ как таковой, но вот быстрый тестовый стенд.Я использовал регулярное выражение и тесты из ответа @ ShaunWilde.

К сожалению, тесты не дают ожидаемых результатов: - |.

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace StackOverflow.RegularExpressions
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var validString =
                new Regex(@"^[a-z][a-z\d!@#$%\^&*()\-+]{0,7}$(?<=\d\D+)",
                          RegexOptions.Compiled);

            var testsAndExpectedResults = new List<Tuple<string, bool>>
                                              {
                                                  new Tuple<string, bool>("a1@aaaaa", true),
                                                  new Tuple<string, bool>("a@1aaaaa", true),
                                                  new Tuple<string, bool>("aa@aaaaa", false),
                                                  new Tuple<string, bool>("a1@aaaaaaa", false),
                                                  new Tuple<string, bool>("a1@aaaa", true),
                                                  new Tuple<string, bool>("1a1@aaaa", false),
                                                  new Tuple<string, bool>("aa1@aaaa", true),
                                                  new Tuple<string, bool>("Aa1@aaaa", false),
                                                  new Tuple<string, bool>("Aa1@aaaA", false),
                                                  new Tuple<string, bool>("aA1@aaaA", false),
                                                  new Tuple<string, bool>("#A@a1aaaaa", false)
                                              };

            testsAndExpectedResults.ForEach(t =>
                                            Console.WriteLine("With '{0}' expected {1}, got {2}", t.Item1, t.Item2,
                                                              validString.IsMatch(t.Item1))
                );

            Console.ReadKey();
        }
    }
}
2 голосов
/ 11 февраля 2012

из памяти;

  • не в верхнем регистре "^[^A-Z]*$"
  • начинаются с буквы "^[A-Za-z].*"
  • имеет по крайней мере 1 цифру ".*\d+.*"
  • может содержать до 8 буквенно-цифровых или @ # $ символов "[A-Za-z0-9@#\$]{,8}"

Теперь вы должны быть в состоянии объединить предложения "have" в "any 1 of this way" довольно просто, но я не знаю, возможно ли на самом деле иметь одно выражение регулярного выражения, которое логически является "не этим, но одно из этого, это или это ". Возможно, другие постеры могут сделать это!

Если вы не уверены в выражениях регулярных выражений, я могу порекомендовать " Expresso " - очень полезный бесплатный инструмент для изучения регулярных выражений. Просто Google для этого!

1 голос
/ 11 февраля 2012
Regex regex = new Regex(@"^[a-z][a-z\d!@#$%\^&*()\-+]{0,7}$(?<=\d\D+)");
bool isValid = regex.IsMatch(password);
  • «Не иметь прописных букв». - Не совпадать с A-Z или \w в любом месте вашего регулярного выражения.
  • «Начать с буквы». - Совпадение ^[a-z].^ - это привязка начала строки.
  • «Содержит до 8 буквенно-цифровых или @ # $ символов (например, символы! @ # $% ^ & * () - +).» - [a-z\d]{0,7} соответствует 0–7 буквенно-цифровым символам.(Эта первая буква соответствовала бы предыдущему [a-z].) Любые дополнительные разрешенные символы также могут быть указаны в классе символов.^ и - необходимо экранировать.
  • «Иметь по крайней мере 1 цифру (ы) не в начале и в конце». - Используйте отрицательный вид сзади: (?<=\d\D+).\d\D+ означает цифру, за которой следует одна или несколько не цифр.Цифра может не появляться в начале из-за второго условия.
1 голос
/ 11 февраля 2012

Первое попадание в Google для "регулярного выражения проверки пароля"

дает нам

^.*(?=.{10,})(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$

, которое

  • должно бытьне менее 10 символов
  • должен содержать как минимум одну строчную букву, одну заглавную букву, одну цифру и один специальный символ
  • Допустимые специальные символы - @ # $% ^ & + =

теперь нужно просто приспособиться к 8 символам (минимум), чтобы в начале и в конце не было чисел, не было заглавных букв, а начиналось с буквы

^.*(?=.{8,})(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=])([a-z][^0-9A-Z])[^A-Z]*[^0-9A-Z]$

, котораябыл протестирован онлайн на RegExPlanet

1       a1@aaaaa        Yes 
2       a1@aaaaaaa      Yes
3       a1@aaaa         No
4       1a@aaaaa        No  
5       aa@aaaa1        No  
6       Aa@aa1aa        No  
7       aa@a1aaA        No  
8       aA@a1aaa        No  
9       #A@a1aaaaa      No  

Я рекомендую вам прочитать первую статью о том, как это было построено (я многому научился) и использовать вторую ссылку (хотя есть много другихонлайн-тестеры регулярных выражений) для работы с регулярными выражениями без необходимости постоянно компилировать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...