Expresión regular para la coincidencia exacta de una cadena


153

Quiero unir dos contraseñas con expresiones regulares. Por ejemplo, tengo dos entradas "123456" y "1234567", entonces el resultado no debe coincidir (falso). Y cuando he ingresado "123456" y "123456", el resultado debe coincidir (verdadero).

No pude hacer la expresión. ¿Cómo lo hago?


9
¿Por qué quieres regex en este caso? La comprobación de la igualdad (exacta) realmente debería hacerse sin expresiones regulares.
Bart Kiers

Porque buscamos cómo reemplazar el texto en un script Bash y obtenemos una respuesta que involucra a Perl y regex.
sudo

teniendo el mismo problema, una mejor solución ^ (123456) le dará los resultados que desea
sdx11

Posible duplicado de la cadena completa
Omer

@canbax ¿Por qué sería una pregunta divertida exactamente?
Milan Velebit

Respuestas:


177

Si tiene una contraseña de entrada en una variable y desea coincidir exactamente con 123456, los anclajes lo ayudarán a:

/^123456$/

en perl la prueba para encontrar la contraseña sería algo así como

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

EDITAR:

Bart Kiers tiene razón, ¿por qué no usas un strcmp () para esto? cada idioma lo tiene a su manera

Como segundo pensamiento, es posible que desee considerar un mecanismo de autenticación más seguro :)


Gracias por las anclas, lo sabía, pero no lo pensé por completo :)
vikingsteve

2
Importante : en Perl y PCRE, quieres en \zlugar de $. /^123456$/coincide con ambos 123456y 123456seguido de un avance de línea, mientras que /^123456\z/solo coincide 123456.
ikegami

154

En la respuesta de malfaux, '^' y '$' se han utilizado para detectar el comienzo y el final del texto.
Por lo general, se usan para detectar el comienzo y el final de una línea.
Sin embargo, esta puede ser la forma correcta en este caso.
Pero si desea hacer coincidir una palabra exacta, la forma más elegante es usar '\ b' . En este caso, el siguiente patrón coincidirá con la frase exacta '123456'.

/ \ b123456 \ b /


¿Estás seguro de que funciona de esa manera? ;) Utilice un probador de expresiones regulares como este . Use el botón "mostrar coincidencia" y verá por qué coincide. Por cierto recuerda '.' Es un personaje especial y bueno para escapar de él. (y es bueno pensarlo dos veces antes de votar: D).
prageeth

2
Si crees que mi respuesta es engañosa o incorrecta, aún puedes publicar tu propia respuesta (como lo hacen otras personas) o colocar un comentario debajo de mi publicación explicando tu sugerencia.
prageeth

26
Su respuesta es engañosa y causará serios problemas a muchas personas. Por ejemplo, usando su enfoque \ bhttp: //www.foo.com \ b coincidirá con http://www.bar.com/?http://www.foo.com , que definitivamente no es una coincidencia exacta, ya que solicitado en el OP. Esto causará serios problemas a las personas que trabajan con URL o contraseñas (que, nuevamente, es lo que solicitó el OP) que contienen caracteres que no son palabras. Debe aclarar su respuesta para que otros no se desvíen.
0x1mason

2
Tendrás que explicarlo. '.' Es un arenque rojo. \ bhttp: // www \ .foo \ .com \ b todavía produce una coincidencia para http://www.bar.com/?http://www.foo.com . Eso no es lo que quiere el OP.
0x1mason

1
@ 0x1mason es correcto \bhttp:\/\/www.foo.com\by coincidirá http://www.foo.com=?http://www.foo.comcon la URL tal como está. La primera respuesta, usando ^(principio) y $(final) es el mejor método a través de estos probadores: regex101.com y regexr.com (el probador incluido en un enlace a continuación no es muy fácil de usar, estos son mucho mejores)
twknab

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

esto asegura que su coincidencia no esté precedida por algún carácter, número o guión bajo y que no le siga inmediatamente el carácter o número o guión bajo

entonces coincidirá con "abc" en "abc", "abc", "abc", pero no con "4abc" ni "abcde"


1
El título de la pregunta es engañoso; él está tratando de asegurarse de que dos cadenas enteras sean exactamente iguales. Además, \wcoincide con dígitos y letras, por lo que [\w\d]es redundante.
Alan Moore

bonito. ver regextester.com/?fam=113232 para "violín" que hice para probarlo
no sincronizado

Los patrones () alrededor me ayudaron.
Ghazal

6

Una forma más directa es verificar la igualdad

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

sin embargo, si realmente quieres apegarte a la expresión regular,

string1 =~ /^123456$/

@ Kurumi Estoy tratando de hacer un código Java que busque una palabra específica en el archivo txt y quiero usar regx, ¿podría usar ese patrón / ^ myword $ / con String.match (/ ^ myword $ /) para buscar el palabra en ese txt?
Antwan

3

También puede probar añadiendo un espacio al principio y al final de la palabra clave: /\s+123456\s+/i.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.