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


154

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

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


9
Почему вы хотите регулярное выражение в этом случае? Проверка на (точное) равенство действительно должна выполняться без регулярных выражений.
Барт Киерс

Потому что мы ищем, как заменить текст в скрипте Bash, и получаем ответ, который включает в себя Perl и регулярные выражения.
SUDO

с тем же вопросом лучшее решение ^ (123456) даст
желаемые

Возможный дубликат матча всей строки
Омер

@canbax Почему это был бы забавный вопрос?
Милан Велебит

Ответы:


177

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

/^123456$/

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

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

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

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

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


Спасибо за якоря, я знал это, но совершенно не думал об этом :)
vikingsteve

2
Важно : в Perl и PCRE вы хотите \zвместо $. /^123456$/соответствует обоим 123456и 123456сопровождается переводом строки, пока /^123456\z/совпадает только 123456.
Ikegami

154

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

/ \ B123456 \ б /


Вы уверены, что это работает таким образом? ;) Пожалуйста, используйте тестер регулярных выражений, как это . Используйте кнопку «показать матч», и вы поймете, почему она соответствует. Кстати помните "." это специальный символ и хорошо, чтобы избежать его. (и хорошо подумать дважды, прежде чем голосовать вниз: 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»


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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.