2012-04-25 3 views
3

Я новичок в регулярном выражении и пытаюсь создать регулярное выражение для проверки паролей. Я хотел бы подтвердить, что парольная фраза есть:regex for passphrase

  • п число слов или более
  • слова должны быть разделены пробелами
  • слова, каждый с п символов или больше
  • число в на хотя бы одно из слов
  • по крайней мере один специальный символ в одном из слов

Это то, что я до сих пор

^(?=.*?((?:.*?\b[a-zA-Z0-9]{2,40}\b)\s*){3,})(?=.*?[@#$%^&+=])(?=.*?[0-9]).*$ 

Он соответствует этой фразе Pe2sI#sHy?ThYulU#, в которой нет не менее 3 слов (без пробелов). Что я делаю не так?

+0

Я хотел бы заменить ваше последнее требование с минимальной длиной. Одно из преимуществ кодовых фраз заключается в том, что они устраняют необходимость помнить кучу сумасшедших номеров и специальных символов, но сохраняют высокий уровень изменчивости, потому что они очень длинные. –

+0

Это правда, но, оставляя вне себя специальные символы, выходит из фразы, уязвимой для атак с использованием статистического анализа при использовании слов, особенно потому, что люди склонны использовать ограниченный набор слов. Добавление по крайней мере одного специального символа улучшает энтропию. – jmm312

ответ

3

Вы должны использовать \s+ вместо \s*. Последний допускает нулевые пробелы, первый требует по крайней мере одного. Но ваше регулярное выражение слишком сложно. Попробуйте следующее:

^     # Start of string 
(?=.*\d)   # Assert at least one digit 
(?=.*[@#$%^&+=]) # Assert at least one special char 
\s*    # Optional leading whitespace 
(?:    # Match... 
\S{2,}   # at least 2 non-spaces 
\s+    # at least 1 whitespace 
){2,}    # at least 2 times 
\S{2,}   # Match at least 2 non-spaces (making 3 "words" minimum) 
+0

+1 потому что я строил аналогичный. Вместо этого я использовал бы '[[: punct:]]' для специального символа. – Birei

+0

Кажется, что это не сработает, с \ s + фраза «тестирование # 123 позволяет тестировать» не будет проверяться, если я не переместил «#» на последнее слово. Мне нужно хотя бы один специальный символ на любом слове. Спасибо за вашу помощь. – jmm312

+0

Извините, ответили be4 Я видел ваши изменения с предлагаемым регулярным выражением. Я проверю это сейчас. Благодаря! – jmm312

1

Немного поздно, так что это всего лишь наблюдение.

Это взлет по методу @Tim Pietzcker.
Хотя слова могут быть любыми, если вы хотите потребовать не менее
3 слова имеют [a-zA-Z0-9] {2,40} символы вложенные, вы можете это сделать.

^      # String start 
(?=.*[@#$%^&+=])  # Assert 1 special char 
(?=.*\d)    # Assert 1 digit 
(?:     # Special 'Word Group' -- Need 2 words 
    .*      # Any char, 0 or more times 
    [a-zA-Z0-9]{2,40}  # Alpha/num char, 2 to 40 times 
    .*      # Any char, 0 or more times 
    \s      # a whitespace, only 1 required 
){2}     # 'Word Group' end, do 2 times 
.*      # Any char, 0 or more times 
[a-zA-Z0-9]{2,40}  # Alpha/num char, 2 to 40 times -- Need 1 word 

Это должно соответствовать по крайней мере 3 специальных [A-Za-z0-9] {2,40} слов, разделенных по меньшей мере, 1
пространства включая цифры и особый характер.

обновление

Да, вы можете объединить их в одну группу сделали {3} раз в 2 способами я знаю.

Использование буфера захвата в качестве флага

^(?=.*[@#$%^&+=])(?=.*\d)(?:(?:(?!\1)|\s).*[a-zA-Z0-9]{2,40}().*){3} 
                ^  ^
--------------------------------------- 

^      # String start 
(?=.*[@#$%^&+=])  # Assert 1 special char 
(?=.*\d)    # Assert 1 digit 
(?:     # Special 'Word Group' 
    (?:     #.. grping start .... 
     (?!\1)    # Either capt group 1 is UN-DEFINED 
     | \s     # OR, require a whitespace 
    )      #.. grping end .... 
    .*      # Any char, 0 or more times 
    [a-zA-Z0-9]{2,40}  # Alpha/num char, 2 to 40 times 
    ()      # DEFINE Capture group 1 
    .*      # Any char, 0 or more times 
){3}     # 'Word Group' end, do 3 times 

Или, с помощью условного

^(?=.*[@#$%^&+=])(?=.*\d)(?:(?(1)\s).*([a-zA-Z0-9]{2,40}).*){3} 
               ^  ^
--------------------------------------- 

^      # String start 
(?=.*[@#$%^&+=])  # Assert 1 special char 
(?=.*\d)    # Assert 1 digit 
(?:     # Special 'Word Group' 
    (?(1)\s)    # Conditional, require a whitespace if capture group 1 captured anything 
    .*      # Any char, 0 or more times 
    ([a-zA-Z0-9]{2,40}) # Capture group 1, Alpha/num char, 2 to 40 times 
    .*      # Any char, 0 or more times 
){3}     # 'Word Group' end, do 3 times 
+0

Спасибо!Ваш ответ удовлетворил дополнительное требование ограничения длины слова. Есть ли другой способ выразить это так, что если необходимо изменить требования длины слова и числа слов, тогда вам нужно изменить только 2 места или меньше, как исходное выражение. Я прошу об этом ради удобочитаемости и избегаю ошибок, когда кто-либо читает мой код. Ваша помощь приветствуется. – jmm312

+0

@ jimm312 - Конечно, это не должно быть слишком сложно. Проверьте обновление. Ура! – sln

+0

Это замечательно. Благодаря! – jmm312

 Смежные вопросы

  • Нет связанных вопросов^_^