Регулярное выражение для точного соответствия строки

154

Я хочу сопоставить два пароля с регулярным выражением. Например, у меня есть два входа «123456» и «1234567», тогда результат не должен совпадать (false). И когда я ввел «123456» и «123456», тогда результат должен совпадать (true).

Я не мог сделать выражение. Как мне это сделать?

Chirayu
источник
9
Почему вы хотите регулярное выражение в этом случае? Проверка на (точное) равенство действительно должна выполняться без регулярных выражений.
Барт Киерс
Потому что мы ищем, как заменить текст в скрипте Bash, и получаем ответ, который включает в себя Perl и регулярные выражения.
SUDO
с тем же вопросом лучшее решение ^ (123456) даст
желаемые
Возможный дубликат матча всей строки
Омер
@canbax Почему это был бы забавный вопрос?
Милан Велебит

Ответы:

177

если у вас есть входной пароль в переменной и вы хотите точно соответствовать 123456, то якоря помогут вам:

/^123456$/

в Perl тест на совпадение пароля будет что-то вроде

print "MATCH_OK" if ($input_pass=~/^123456$/);

РЕДАКТИРОВАТЬ:

Барт Киерс прав, почему вы не используете для этого strcmp ()? каждый язык имеет его по-своему

как вторая мысль, вы можете рассмотреть более безопасный механизм аутентификации :)

user237419
источник
Спасибо за якоря, я знал это, но совершенно не думал об этом :)
vikingsteve
2
Важно : в Perl и PCRE вы хотите \zвместо $. /^123456$/соответствует обоим 123456и 123456сопровождается переводом строки, пока /^123456\z/совпадает только 123456.
Ikegami
154

В ответе Малфо « и «$» использовались для определения начала и конца текста.
Они обычно используются для определения начала и конца строки.
Однако это может быть правильным способом в этом случае.
Но если вы хотите подобрать точное слово, более элегантный способ - использовать \ b . В этом случае следующий шаблон будет соответствовать точной фразе «123456».

/ \ B123456 \ б /

prageeth
источник
Вы уверены, что это работает таким образом? ;) Пожалуйста, используйте тестер регулярных выражений, как это . Используйте кнопку «показать матч», и вы поймете, почему она соответствует. Кстати помните "." это специальный символ и хорошо, чтобы избежать его. (и хорошо подумать дважды, прежде чем голосовать вниз: D).
пражет
2
Если вы считаете, что мой ответ вводит в заблуждение или ошибочен, вы все равно можете опубликовать свой собственный ответ (как это делают другие люди) или разместить под моим сообщением комментарий, объясняющий ваше предложение.
пражет
26
Ваш ответ вводит в заблуждение и вызовет у многих людей серьезные проблемы. Например, использование вашего подхода \ bhttp: //www.foo.com \ b будет совпадать с http://www.bar.com/?http://www.foo.com , что, безусловно, не является точным совпадением, так как запрашивается в ОП. Это вызовет серьезные проблемы у людей, работающих с URL-адресами или паролями (которые, опять же, это то, что запрошено OP), которые содержат несловарные символы. Вы должны уточнить свой ответ, чтобы другие не сбились с пути.
0x1mason
2
Вам придется объяснить. '' красная сельдь \ bhttp: // www \ .foo \ .com \ b по-прежнему создает совпадение для http://www.bar.com/?http://www.foo.com . Это не то, что хочет ОП.
0x1mason
1
@ 0x1mason является правильным, и \bhttp:\/\/www.foo.com\bбудет соответствовать http://www.foo.com=?http://www.foo.comURL-адресу как есть. Первый ответ, использующий ^(начало) и $(конец), является лучшим методом с помощью следующих тестеров: regex101.com и regexr.com (тестер, включенный в приведенную ниже ссылку, не очень
удобен для
34
(?<![\w\d])abc(?![\w\d])

это гарантирует, что вашему совпадению не предшествует какой-либо символ, число или знак подчеркивания, и сразу же после него не следует символ, число или знак подчеркивания.

поэтому он будет соответствовать «abc» в «abc», «abc.», «abc», но не «4abc» и не «abcde»

Aedna
источник
1
Название вопроса вводит в заблуждение; он пытается убедиться, что две строки одинаковы. Кроме того, \wсоответствует цифрам, а также буквам, поэтому [\w\d]является избыточным.
Алан Мур
отлично. см. regextester.com/?fam=113232 для "скрипки", которую я сделал, чтобы попробовать
несинхронизировано
() Шаблоны вокруг помогли мне.
Газель
6

Более простой способ - проверить равенство

if string1 == string2
  puts "match"
else
  puts "not match"
end

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

string1 =~ /^123456$/
Каруми
источник
@Kurumi Я пытаюсь сделать Java-код, который ищет определенное слово в текстовом файле, и я хочу использовать regx, поэтому я могу использовать этот шаблон / ^ myword $ / с String.match (/ ^ myword $ /) для поиска слово в этом тексте?
Antwan
3

Вы также можете попробовать добавив пробел в начале и в конце ключевого слова: /\s+123456\s+/i.

Бхушан Лодха
источник