Хобрук: Ваш путь к мастерству в программировании

Несоответствие регулярного выражения Java

Мне нужно проверить пароль с помощью reqex. Я написал один и протестировал его в этой программе проверки, и он работает: http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp

Но когда я добавляю его в свое Java-приложение, он терпит неудачу.

Регулярное выражение в средстве проверки регулярных выражений: (\D+)(\d+)(\D+)(.*)

Регулярное выражение в java: (\\D+)(\\d+)(\\D+)(.*)

Тестовая строка: 1Hello2

Это проходит в онлайн-проверке, но не работает в Java.

Кто-нибудь знает, почему?

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

Мне нужно 2 отдельных регулярных выражения: одно, которое соответствует цифрам в середине (пароль1слово или 1пароль1слово или 1пароль1слово), а также регулярное выражение, которое соответствует цифре в начале или конце (1пароль или пароль1 НЕ пароль1слово1, потому что это находится в строковой категории).

28.03.2012

  • В онлайн-чекер не проходит, и я знаю почему. А именно, \D означает нецифровой символ. Чтобы сопоставить что-либо с числом в середине, используйте что-то вроде '.+\d+.*'. 28.03.2012
  • @Lev: Я думаю, ты имеешь в виду .*\d.*. 28.03.2012
  • @NiklasB, ты прав. Хотя эффект должен быть тот же. 28.03.2012
  • @Lev: Нет, даже после редактирования он не будет соответствовать, например, 1hello, хотя, согласно OP, это правильный пароль. 28.03.2012
  • @NiklasB: ооо, я неправильно прочитал (неправильно) твой комментарий. На самом деле я имею в виду регулярное выражение '.+\d.+' (слишком поздно редактировать первый комментарий). Ваше регулярное выражение соответствует любому паролю с цифрой в нем. Мой соответствует любому с цифрой посередине, как я понимаю последнее предложение вопроса. 28.03.2012
  • Я хочу, чтобы регулярное выражение соответствовало любому паролю, у которого есть число в середине (может быть и в начале, и в конце). В основном вы хотите сопоставить что-нибудь с цифрой в нем :) 28.03.2012
  • @Lev: имеет число в середине (может быть в начале и в конце) 28.03.2012
  • @NiklasB., да, и мы понимаем это по-разному. Я понял, что единственным обязательным требованием была цифра посередине. Вы поняли, что '1hello2' тоже подойдет. Вероятно, ОП действительно имеет в виду это, но я не понимаю, почему это так сказано :) Просто скажите: сопоставьте строку с числом. Кстати, \d является допустимым регулярным выражением для этого. 28.03.2012
  • @Lev: Да, \d допустимо, но не работает с String.matches в Java (здесь вы также должны сопоставить префикс и суффикс). Кстати, 1Hello2 - это точная тестовая строка, которую дал OP (говоря, что она должна совпадать). 28.03.2012
  • Спасибо за ваши ответы. Мне нужно дать пользователю обратную связь о надежности пароля, а пароль, такой как пароль1, является надежным, а пароль1 или 1пароль — средним. Мне нужно регулярное выражение, которое говорит, что 1pass1word или pass1word1 или 1pass1word1 является сильным. Использование .+\\d.+ работает некорректно, но, возможно, я слишком придирчив. С .+\\d.+ пароль 123 будет совпадать, хотя на самом деле этого не должно быть, потому что цифры стоят в начале. 29.03.2012
  • Думаю, мой оригинальный пост был немного вводящим в заблуждение. Мне нужно 2 отдельных регулярных выражения: одно, которое соответствует цифрам в середине (пароль1слово или 1пароль1слово или 1пароль1слово), а также регулярное выражение, которое соответствует цифре в начале или конце (1пароль или пароль1 НЕ пароль1слово1, потому что это находится в строковой категории). 29.03.2012

Ответы:


1

Ваше регулярное выражение требует:

  1. не цифра (1 или более раз) \D+
  2. 1 или более цифр
  3. Одна или несколько нецифр \D+
  4. Любой символ(ы) 0 или более раз.

Ваш пример содержит

  1. 1 цифра
  2. 5 нецифр
  3. 1 цифра

Я думаю, очевидно, что это не соответствует регулярному выражению: первый элемент \D+ терпит неудачу, потому что цифра появляется в начале.

28.03.2012
  • Мое решение в конце: Match strong (\\d*)(\\D+)(\\d+)(\\D+)(.*). Среднее соответствие: (\\d+)(\\D+)) || (\\D+)(\\d+)) || (\\d+)(\\D+)(\\d+) 29.03.2012
  • Новые материалы

    Как я могу подписаться на тему изображений в ROS Matlab и получить изображение RGB?
    Привет, Пожалуйста, как я могу извлечь изображение из сообщения ROS Image, за которым следует imshow? Я уже подписался на правильную тему, но message.getData() дает мне объект..

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..