字符串精确匹配的正则表达式

241
我想用正则表达式匹配两个密码。例如,我有两个输入 "123456" 和 "1234567",那么结果应该是不匹配 (false)。当我输入 "123456" 和 "123456" 时,结果应该匹配 (true)。
我无法制作出这个表达式。我该怎么做?

12
为什么在这种情况下你想使用正则表达式?检查(精确的)相等性应该不需要用正则表达式来完成。 - Bart Kiers
1
因为我们查找如何在Bash脚本中替换文本,并得到一个涉及Perl和正则表达式的答案。 - sudo
有同样的问题,一个更好的解决方案是使用^(123456),这将给出你想要的结果。 - sdx11
@canbax 为什么这个问题会很有趣呢? - Milan Velebit
为什么不直接使用 ===? - albanx
显示剩余2条评论
7个回答

264

如果你有一个存储在变量中的输入密码并且想要精确匹配123456,那么锚点可以帮助你:

/^123456$/

在Perl中,匹配密码的测试大概是这样的:

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

编辑:

bart kiers 是正确的,为什么不使用 strcmp() 来做这件事呢?每种语言都有它自己的方式。

另一方面,您可能希望考虑使用更安全的身份验证机制:)


3
重要提示:在Perl和PCRE中,您应该使用\z而不是$/^123456$/匹配123456以及123456后面跟随一个换行符,而/^123456\z/仅匹配123456 - ikegami
谢谢这个。我发现Voidtools Everything搜索不需要使用正则表达式选项中的/。只需使用“^”和“$”即可,因为它们已被视为特殊字符。对于运行时类型工具非常有用,因为它们已经知道/期望它。 - Andrew Marais

204
在malfaux的回答中,使用'^''$'来检测文本的开头和结尾。通常这些用于检测一行的开头和结尾。
然而,在这种情况下可能是正确的方式。但如果你想匹配一个确切的单词,更简洁的方法是使用'\b'。在这种情况下,以下模式将匹配确切的短语'123456'。

/\b123456\b/


你确定它是以那种方式工作的吗? ;) 请使用正则表达式测试器,例如这个。使用“显示匹配项”按钮,您将看到为什么它匹配。顺便提一下,记得'.'是一个特殊字符,最好对其进行转义。(在点赞前最好三思 :D)。 - prageeth
3
如果你认为我的答案有误导或错误,你仍然可以发布自己的答案(就像其他人一样)或在我的帖子下面发表评论,解释你的建议。 - prageeth
39
你的回答会误导很多人,可能会导致严重的问题。例如,使用你的方法\bhttp://www.foo.com\b将匹配http://http://www.bar.com/?http://www.foo.com,这显然不是OP要求的完全匹配。这会给使用包含非单词字符的URL或密码的人带来严重问题(而这正是OP所要求的)。你应该澄清你的回答,以免他人被误导。 - 0x1mason
2
你需要解释一下。'.'是一个误导信息。\bhttp://www\.foo\.com\b仍然会匹配http://http://www.bar.com/?http://www.foo.com。这不是OP想要的。 - 0x1mason
1
@0x1mason 是正确的,\bhttp:\/\/www.foo.com\b 将匹配 http://www.foo.com=?http://www.foo.com 以及原始的 URL。第一个回答使用 ^(开头)和 $(结尾)是最好的方法,通过这些测试者:https://regex101.com 和 http://regexr.com(下面链接中包含的测试者不太友好,这些更好)。 - twknab
显示剩余4条评论

55
(?<![\w\d])abc(?![\w\d])

这样做可以确保你的匹配项不会被某个字符、数字或下划线所前置,并且不会被紧随着一个字符、数字或下划线所跟随。

因此,它会在"abc","abc.","abc "中匹配"abc",但不匹配"4abc"和"abcde"。


2
问题的标题有误导性,他想确保两个完整的字符串完全相同。此外,\w匹配数字和字母,因此[\w\d]是多余的。 - Alan Moore
1
很好。请查看 https://www.regextester.com/?fam=113232 以查看我尝试它的“fiddle”。 - unsynchronized
如何设计以匹配带有括号的“(abc)”? - Usama Ahmed
1
警告:如果您计划在React或其他框架中使用后顾操作符(?<!),它将无法在iOS设备上工作。控制台中也不会显示任何错误。 您可以在此处阅读更多信息[https://dev59.com/EVUK5IYBdhLWcg3wmw8S]。 - Santhosh

6
更为简单直接的方法是检查是否相等。
if string1 == string2
  puts "match"
else
  puts "not match"
end

然而,如果你真的想坚持使用正则表达式,
string1 =~ /^123456$/

@Kurumi 我正在尝试编写Java代码,以在txt文件中搜索特定单词,并且我想使用正则表达式,那么我可以使用模式/^myword$/来使用String.match(/^myword$/ )查找该txt中的单词吗? - Antwan

5
您可以尝试在关键字的开头和结尾添加一个空格:/\s+123456\s+/i。这可能会有所帮助。

1
如果你正在使用Python,re有一个re.fullmatch方法,比修改字符串更容易。

0

你可以使用 JavaScript 字符串的 match 方法和正则表达式模式来匹配一个完全相同的字符串。

let str1 = '123456' ;
console.log(str1.match(/^123456$/)) ; //['123456', index: 0, input: '123456', groups: undefined]
console.log(str1.match(/^1234567$/)) ; //null

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接