Expressão regular para correspondência exata de uma string

153

Eu quero combinar duas senhas com expressão regular. Por exemplo, eu tenho duas entradas "123456" e "1234567", então o resultado não deve corresponder (falso). E quando eu tiver inserido "123456" e "123456", o resultado deverá corresponder (verdadeiro).

Eu não consegui fazer a expressão. Como eu faço isso?

Chirayu
fonte
9
Por que você deseja regex neste caso? A verificação da igualdade (exata) deve realmente ser feita sem regex.
Bart Kiers
Porque procuramos como substituir o texto em um script Bash e obtemos uma resposta que envolve Perl e regex.
Sudo #
tendo o mesmo problema uma solução melhor ^ (123456) dará os resultados que você quer
sdx11
Possível duplicata da sequência inteira
Omer
@canbax Por que isso seria exatamente uma pergunta engraçada?
Milan Velebit

Respostas:

177

se você possui uma senha de entrada em uma variável e deseja corresponder exatamente a 123456, as âncoras o ajudarão:

/^123456$/

em perl o teste para combinar a senha seria algo como

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

EDITAR:

Bart Kiers está certo, por que você não usa um strcmp () para isso? toda língua tem à sua maneira

como um segundo pensamento, você pode considerar um mecanismo de autenticação mais seguro :)

user237419
fonte
Obrigado pelas âncoras, eu sabia que, mas completamente não pensar nisso :)
vikingsteve
2
Importante : No Perl e no PCRE, você deseja, em \zvez de $. /^123456$/corresponde a ambos 123456e 123456seguido por um avanço de linha, enquanto /^123456\z/corresponde apenas 123456.
Ikegami 29/09/19
154

Na resposta do malfaux, '^' e '$' foram usados ​​para detectar o início e o final do texto.
Geralmente são usados ​​para detectar o início e o fim de uma linha.
No entanto, este pode ser o caminho correto neste caso.
Mas se você deseja combinar uma palavra exata, a maneira mais elegante é usar '\ b' . Nesse caso, o seguinte padrão corresponderá à frase exata '123456'.

/ \ b123456 \ b /

prageeth
fonte
Você tem certeza de que funciona dessa maneira? ;) Por favor, use um testador de regex como este . Use o botão "show match" e você verá por que ele corresponde. Lembre-se de '.' é um caractere especial e bom para escapar dele. (e bom pensar duas vezes antes de votar: D).
prageeth
2
Se você acha que minha resposta é enganosa ou errada, você ainda pode postar sua própria resposta (como outras pessoas fazem) ou colocar um comentário em minha postagem, explicando sua sugestão.
prageeth
26
Sua resposta é enganosa e causará sérios problemas a muitas pessoas. Por exemplo, usando sua abordagem \ bhttp: //www.foo.com \ b corresponderá a http://www.bar.com/?http://www.foo.com , que definitivamente não é uma correspondência exata, pois solicitado no PO. Isso causará sérios problemas para as pessoas que trabalham com URLs ou senhas (que, novamente, é o que o OP solicitou) que contenham caracteres que não sejam palavras. Você deve esclarecer sua resposta para que outros não sejam desviados.
0x1mason
2
Você terá que explicar. '.' é um arenque vermelho. \ bhttp: // www \ .foo \ .com \ b ainda produz uma correspondência para http://www.bar.com/?http://www.foo.com . Não é isso que o OP quer.
0x1mason
1
@ 0x1mason está correto, que \bhttp:\/\/www.foo.com\bcorresponderá http://www.foo.com=?http://www.foo.comao URL como está. A primeira resposta, usando o ^(início) e $(fim), é o melhor método através desses testadores: regex101.com e regexr.com (o testador incluído em um link abaixo não é muito amigável, é muito melhor)
twknab
34
(?<![\w\d])abc(?![\w\d])

isso garante que sua correspondência não seja precedida por algum caractere, número ou sublinhado e não seja seguida imediatamente por caractere ou número ou sublinhado

portanto, ele corresponderá a "abc" em "abc", "abc.", "abc", mas não em "4abc", nem "abcde"

Aedna
fonte
1
O título da pergunta é enganoso; ele está tentando garantir que duas cordas inteiras sejam exatamente iguais. Além disso, \wcombina dígitos e letras, portanto [\w\d]é redundante.
Alan Moore
legais. veja regextester.com/?fam=113232 para "violino" que fiz para experimentá-lo
não sincronizado
Os padrões () ao redor me ajudaram.
Ghazal
6

Uma maneira mais direta é verificar a igualdade

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

no entanto, se você realmente deseja manter a expressão regular,

string1 =~ /^123456$/
Kurumi
fonte
@ Kurumi Estou tentando fazer o código java que procura por palavra específica no arquivo txt e eu quero usar regx, então eu poderia usar esse padrão / ^ myword $ / com String.match (/ ^ myword $ /) para procurar o palavra nesse txt?
Antwan 30/03
3

Você também pode tentar anexar um espaço no início e final de palavra-chave: /\s+123456\s+/i.

Bhushan Lodha
fonte