Почему я получаю недопустимые escape-символы с помощью регулярного выражения в Java? - PullRequest
1 голос
/ 01 апреля 2010

Я работаю над простой проверкой надежности пароля и не могу применить регулярные выражения. В разных ресурсах определены разные виды регулярных выражений. я также нахожу регулярные выражения javascript, но у меня были некоторые проблемы с адаптацией.

Во-первых, это регулярные выражения, которые мне нужны для JAVA :

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

Моя цель - не быть экспертом по регулярным выражениям, я просто хочу использовать нужные мне части. Если вы дадите мне хорошие уроки, которые обсуждаются выше для java , они будут оценены.

Во-вторых, в этой ссылке некоторые из них упоминаются, но у меня возникают проблемы с их применением.

здесь не улавливается строчная буква (мой пропуск: A5677a)

if (passwd.matches ("(? =. * [A-z])")) // [проверено] хотя бы одна строчная буква {Score = Score + 5;}

Также здесь я получаю сообщение об ошибке: недопустимый escape-символ.

if (passwd.matches ("(? =. * \ D)")) // [проверено] хотя бы одно число

Наконец, все ли эти выражения различны в разных языках программирования или в скриптах?

Ответы [ 3 ]

1 голос
/ 01 апреля 2010

Проблема с первым регулярным выражением ("(?=.*[a-z])") заключается в том, что вы пытаетесь сопоставить последовательность, которая заканчивается на a-z; * применяется к ., который в целом говорит: «сопоставьте что-либо, затем заканчивайте буквой от a до z».

Чтобы передать буквальный обратный слеш, вам нужно экранировать его так: "(?=.*\\d)".

Недопустимая escape-последовательность из-за того, что Java пытается обработать escape-последовательности в строке до того, как она будет передана в регулярное выражение - \d не сопоставляется ни с чем, в отличие от \t или \n, которые отображаются на tab и перевод строки.

Чтобы упростить процесс разработки с помощью регулярных выражений, я бы предложил использовать такой инструмент, как Regex Coach , который позволит вам проверить свои регулярные выражения перед компиляцией программы, чтобы вы могли увидеть результаты в режиме реального времени. Есть также онлайн-ресурсы, такие как RegExr .

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

0 голосов
/ 01 апреля 2010

Я думаю, что использование регулярного выражения в этом случае было бы довольно неэффективно. Регулярное выражение не будет отслеживать, сколько у вас есть xs, ys и zs (где x, y и z - те критерии, которые вы перечислили выше) - это означает, что вам нужно будет применить несколько регулярных выражений (как вы в вашем примере), каждый из которых может занимать до линейного времени.

Почему бы просто не написать функцию обработки, которая вместо этого проверяет каждый символ в вашем пароле? Вы можете выполнить всю проверку за один проход.

Частичный пример:

public boolean isStrong(String toCheck) {
    boolean hasLower = false;
    boolean hasUpper = true;

    for (int i = 0; i < toCheck.length(); i++) {
      char next = toCheck.charAt(i);
      if (Character.isLower(next)) {
        hasLower = true;
      } else if (Character.isUpper(next)) {
        hasUpper = true;
      }
    }

    return hasLower && hasUpper;
}

Редактировать : Я только что заметил, что вы вычисляете счет, а не проверяете слабый против сильного; это можно легко адаптировать соответственно.

0 голосов
/ 01 апреля 2010

Судя по количеству регулярных выражений, которое вам нужно, возможно, пришло время стать экспертом по регулярным выражениям. Посмотрите учебник на регулярные выражения.info , вот чему научил меня регулярное выражение.

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