Регулярний вираз для точної відповідності рядка


153

Я хочу відповідати двом паролям із регулярним виразом. Наприклад, у мене є два входи "123456" і "1234567", тоді результат не повинен відповідати (помилково). І коли я вписав "123456" і "123456", то результат повинен відповідати (вірно).

Я не міг зробити вираз. Як це зробити?


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

Тому що ми шукаємо, як замінити текст у Bash-скрипті та отримаємо відповідь, що включає Perl та регулярний вираз.
судо

з тим же питанням краще рішення ^ (123456) дасть потрібні результати
sdx11

Можливий дублікат матчу цілою
Омер

@canbax Чому саме це було б смішним питанням?
Мілан Велебіт

Відповіді:


177

якщо у вас є вхідний пароль в змінній і ви хочете відповідати точно 123456, то якір допоможе вам:

/^123456$/

в perl тест на відповідність паролю був би чимось на зразок

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

Редагувати:

bart kiers - це прямо тхо , чому б ви не використали strcmp () для цього? кожна мова має це по-своєму

як другу думку, ви можете розглянути більш безпечний механізм аутентифікації :)


Дякую за якіри, я це знав, але повністю не замислювався над цим :)
vikingsteve

2
Важливо : В Perl та PCRE ви хочете \zзамість $. /^123456$/відповідає обом 123456і 123456супроводжується стрічковою стрічкою, тоді як /^123456\z/лише збіги 123456.
ikegami

154

У відповіді malfaux "^" та "$" використовувались для виявлення початку та кінця тексту.
Зазвичай вони використовуються для виявлення початку та кінця рядка.
Однак це може бути правильний шлях у цьому випадку.
Але якщо ви хочете відповідати точному слову, більш елегантним способом є використання "\ b" . У цьому випадку наступний зразок буде відповідати точній фразі '123456 '.

/ \ b123456 \ b /


Ви впевнені, що це працює таким чином? ;) Будь ласка , використовуйте регулярний вираз тестер , як це . Натисніть кнопку "показати відповідність", і ви побачите, чому вона відповідає. До речі пам’ятайте '.' це особливий чар і добре уникати цього. (і добре подумати, перш ніж проголосувати: D).
prageeth

2
Якщо ви вважаєте, що моя відповідь є хибною чи неправильною, ви все одно можете опублікувати власну відповідь (як це роблять інші) або розмістити коментар під моїм повідомленням, пояснюючи вашу пропозицію.
prageeth

26
Ваша відповідь вводить в оману і спричинить у багатьох людей серйозні проблеми. Наприклад, використовуючи ваш підхід \ bhttp: //www.foo.com \ b відповідатиме http://www.bar.com/?http://www.foo.com , що, безумовно, не є точно збігом, як запитується в ОП. Це спричинить серйозні проблеми для людей, які працюють з URL-адресами або паролями (що, знову ж таки, те, про що вимагала ОП), які містять несловні символи. Ви повинні уточнити свою відповідь, щоб інші не заблукали.
0х1масон

2
Вам доведеться пояснити. '.' - червона оселедець. \ bhttp: // www \ .foo \ .com \ b все ще створює відповідність для http://www.bar.com/?http://www.foo.com . Це не те, чого хоче ОП.
0х1масон

1
@ 0x1mason правильний, що \bhttp:\/\/www.foo.com\bзбігатиметься http://www.foo.com=?http://www.foo.comз URL-адресою, як є. Перша відповідь, використовуючи ^(початок) і $(кінець), є найкращим методом через ці тестери: regex101.com та regexr.com (тестер, включений у посилання нижче, не дуже зручний для користувачів, це набагато краще)
twknab

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 для пошуку конкретного слова у файлі txt, і я хочу використовувати regx, щоб я міг використовувати цей шаблон / ^ myword $ / за допомогою String.match (/ ^ myword $ /) для пошуку слово в цьому txt?
Антван

3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.