2011-08-21 10 views
6

Tengo curiosidad de por qué esto no funciona, y necesito saber por qué y cómo solucionarlo; Estoy tratando de detectar si alguna entrada es una pregunta, estoy bastante seguro de String.match es lo que necesito, pero:Lua string.match usa expresiones regulares irregulares?

print(string.match("how much wood?", "(how|who|what|where|why|when).*\\?"))

devuelve nil. Estoy pretty sure Lua's string.match uses regular expressions para encontrar coincidencias en una cadena, ya que he usado comodines (.) Antes con éxito, pero tal vez no entiendo todas las mecánicas. ¿Lua requiere delimitadores especiales en sus funciones de cadena? He probado mi expresión regular here, por lo que si Lua usa expresiones regulares regulares, parece que el código anterior devolvería "how much wood?".

¿Alguno de ustedes me puede decir lo que estoy haciendo mal, lo que quiero hacer o señalarme una buena referencia en la que pueda obtener información exhaustiva sobre cómo las funciones de manipulación de cadenas de Lua utilizan expresiones regulares?

Respuesta

11

Lua no utiliza expresiones regulares. Lua usa Patterns, que se ven similares pero coinciden con entradas diferentes.

.* también consumirá la última ? de la entrada, por lo que falla en \\?. El signo de interrogación debe ser excluido. Los caracteres especiales se escapan con %.

"how[^?]*%?" 

Como dijo Omri Barel, no hay operador de alternancia. Probablemente necesite usar varios patrones, uno para cada palabra alternativa al comienzo de la oración. O puede usar una biblioteca que admita expresiones similares a expresiones regulares.

+0

Oh, gracias. Creo que realmente me confundió porque los patrones se parecen mucho a la expresión regular, pero un poco diferente de todos modos. – Uronym

8

De acuerdo con manual, los patrones no admiten la alternancia.

Mientras que "how.*" funciona, "(how|what).*" doesnt.

Y kapep tiene razón sobre el signo de interrogación tragado por .*.

Hay una pregunta relacionada: Lua pattern matching vs. regular expressions.