¿Cómo hago coincidir una cadena completa con una expresión regular?

82

Necesito una expresión regular que solo encuentre coincidencias donde toda la cadena coincide con mi consulta.

Por ejemplo, si hago una búsqueda de películas con el nombre "Octubre rojo", solo quiero hacer coincidir ese título exacto (no distingue entre mayúsculas y minúsculas) pero no coincide con títulos como "La caza del octubre rojo". No estoy muy seguro de saber cómo hacer esto. ¿Nadie sabe?

¡Gracias!

Miqueas
fuente
1
¿Por qué necesita una expresión regular para algo para lo que funcionará un simple string.Contains?
Oded
1
La razón por la que necesito usar una expresión regular es que la estoy usando para una búsqueda en MongoDB y necesito que no distinga entre mayúsculas y minúsculas, lo que solo se puede hacer con una expresión regular
Micah
¿Por qué no convertir (sobre la marcha) los datos de la base de datos a minúsculas y cadenas de minúsculas del usuario para la búsqueda?
greenoldman
1
@macias No estoy en desacuerdo con que sería una mejor opción, pero lamentablemente mi situación actual no lo permite.
Micah
Para su información, si no requiere el uso de una expresión regular, simplemente tratando de comparar dos cadenas ignorando el caso, simplemente puede hacerlostring1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

Respuestas:

110

Prueba la siguiente expresión regular:

^Red October$

De forma predeterminada, las expresiones regulares distinguen entre mayúsculas y minúsculas. El ^marca el inicio del texto coincidente y $el final.

Pieter van Ginkel
fuente
1
Para su información, vale la pena mencionar que para que no distinga entre mayúsculas y minúsculas, cuando cree un objeto regex, agregue el segundo parámetro RegexOptions.IgnoreCase.
ToolmakerSteve
Esto no funciona si hay algo más alrededor de esa cadena. Por ejemplo, si estaba buscando "St" como en Street, pero tiene otras cadenas en la misma línea que también comienzan con "St" como el nombre "Stirling", esta expresión regular no coincidirá exactamente. Desafortunadamente, no estoy seguro de que RegEx sea la respuesta correcta para este escenario. Aunque voy a seguir intentándolo. La respuesta de Tim a continuación es buena, pero no todos los motores lo admiten.
dyslexicanaboko
En realidad, $no siempre coincide con el final de la cadena, \zsí ( \Zes el equivalente en Python). Consulte la respuesta de Tim Pietzcker . Sin embargo, es cierto para JavaScript.
Wiktor Stribiżew
40

En general, y con la configuración predeterminada, ^y $los anclajes son una buena manera de asegurar que una expresión regular coincide con una cadena completa.

Sin embargo, algunas advertencias:

Si tiene alternancia en su expresión regular, asegúrese de encerrar su expresión regular en un grupo que no captura antes de rodearla con ^y $:

^foo|bar$

es por supuesto diferente de

^(?:foo|bar)$

Además, ^y $puede adquirir un significado diferente (inicio / final de línea en lugar de inicio / final de cadena ) si se establecen determinadas opciones. En los editores de texto que admiten expresiones regulares, este suele ser el comportamiento predeterminado. En algunos idiomas, especialmente Ruby, este comportamiento ni siquiera se puede desactivar.

Por lo tanto, hay otro conjunto de anclajes que están garantizados para coincidir solo al principio / final de toda la cadena:

\A coincide con el comienzo de la cadena.

\Z coincide con el final de la cadena o antes de un salto de línea final.

\z coincide con el final de la cadena.

Pero no todos los lenguajes admiten estos anclajes, especialmente JavaScript.

Tim Pietzcker
fuente
4
esta es la respuesta más útil
Jeremy Danyow
18

Use los modificadores ^y $para indicar dónde se encuentra el patrón de expresiones regulares en relación con el inicio y el final de la cadena:

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail
Tim Robinson
fuente
10

Sé que esto puede ser un poco tarde para responder esto, pero quizás sea útil para otra persona.

Manera más sencilla:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}
Zixav
fuente
2
En mi humilde opinión, esto es menos simple que la respuesta aceptada. Pero es una alternativa.
ToolmakerSteve
Me gusta esta respuesta porque el código en sí muestra el comportamiento previsto, en lugar de modificar la expresión regular (que podría ser menos clara para alguien que mira el código con poca comprensión de la expresión regular). El problema potencial es que la expresión regular podría escribirse para que coincida con la cadena completa o una parte de ella, con la función Regex.Match devolviendo la coincidencia parcial aunque sea posible una coincidencia completa.
John Thoits
8

Debe encerrar su expresión regular en ^(inicio de cadena) y $(final de cadena):

^Red October$
Anton Gogolev
fuente
0

Lo siento, pero eso no está claro.

Por lo que leí, quieres hacer una comparación de cadenas simple. No necesitas regex para eso.

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());
Dean Thomas
fuente
1
La razón por la que necesito usar una expresión regular es que la estoy usando para una búsqueda en MongoDB y necesito que no distinga entre mayúsculas y minúsculas, lo que solo se puede hacer con una expresión regular.
Micah
-1

Puede hacerlo así si solo quiero capturar una vez la letra menos a en una cadena y se puede verificar con myRegex.IsMatch ()

^ [^ e] [e] {1} [^ e] $

Vincent Roy
fuente