2010-04-16 9 views
12

Fin de anclaje de la línea $ partido ni siquiera existe adicional detrás \n en cadena coincidente, de manera que usamos \Z en lugar de $¿Cuándo debería usar A en una expresión regular?

Por ejemplo

^\w+$ coincidirá con una cadena abcd\n pero ^\w+\Z no es

Cómo aproximadamente \A y cuándo usarlo?

+0

¿No te refieres a '^ \ w + \ z' (minúscula z)? '\ Z' y' $ 'son iguales (cuando no estás usando el modificador'/m'). – cjm

+0

@cjm, probé en python, y en mi humilde opinión, no es lo mismo, '^ \ w + \ Z' no coincide con' abcd \ n', pero $ lo hace, pero no estoy seguro de que Python y Perl realicen la implementación de '\ Z 'es diferente, pero en python' \ Z' y '\ z' son los mismos, (creo que porque no veo' \ z' en python docs), no tengo perl en este momento. – YOU

+0

@cjm, acabo de probar en codepad.org, sí, el '\ Z' en python quiero decir es' \ z' en perl, pensé que son iguales en ambos idiomas. – YOU

Respuesta

20

La mayoría de las veces se usa cuando también se habilitan las coincidencias de varias líneas. Como \A solo coincide al principio del texto COMPLETO, en lugar de solo un comienzo de línea, en las expresiones regulares que pueden coincidir entre líneas, la funcionalidad de ^ y \A es diferente.

+0

+1 gracias, ¿pero la gente realmente lo está usando? ¿No es eliminar '/ m' y usar'^'es el mismo comportamiento? – YOU

+0

Sí, lo uso. Piense en intentar buscar una cadena que USTED espera que no tenga líneas nuevas incorporadas, pero un usuario la ingrese. Espera poder buscar toda la cadena, pero^y $ se confunden y solo analiza la primera parte de la cadena . Podría terminar inyectando algún código maligno en una consulta o almacenándolo en una base de datos. Sí, es confuso pero \ m, \ A, \ z,^y $ tienen sus usos, así que debes entender cuándo y dónde usarlos. Quizás ese no sea un buen ejemplo, pero puede ser realmente importante. Tal vez alguien pueda agregar algunos ejemplos del mundo real. –

+0

Si intentas, por ejemplo, unir un par de líneas al principio de un archivo de registro dentro de un conjunto de registros, necesitarías habilitar la coincidencia de varias líneas, pero no podrías usar '^' (ya que quieres unir líneas al principio del archivo de registro, no en el medio). Ese sería un caso de uso potencial. – Amber

4

Al igual que con cualquier característica de expresión regular, la usa cuando describe más exactamente lo que necesita en comparación con cualquier característica más general. Si sabe que desea hacer coincidir exactamente al comienzo de una cadena (en lugar de líneas lógicas), use la función de expresión regular que lo describe. No use funciones de expresión regular que puedan coincidir en situaciones que no desee.

para Perl, ver las perlre docs para obtener detalles sobre las afirmaciones de ancho cero:

\b Match a word boundary 
\B Match except at a word boundary 
\A Match only at beginning of string 
\Z Match only at end of string, or before newline at the end 
\z Match only at end of string 
\G Match only at pos() (e.g. at the end-of-match position 
    of prior m//g) 
2

no se refiera directamente a su pregunta de acuerdo a las etiquetas que ha utilizado, pero hay al menos una lengua (Rubí) donde ^ y $ siempre significa inicio/final de línea, por lo que si desea hacer coincidir el inicio/fin-de-cadena que tiene utilizar \A y \Z o \z.

Si desea mantener sus expresiones regulares portátil, es una buena práctica para establecer explícitamente lo que quiere que hagan en lugar de depender de la disponibilidad de modificadores de modo como \m o Regex.MULTILINE etc.

Por otra parte, JavaScript , POSIX y XML no son compatibles con \A y \Z. Aquí es donde herramientas como RegexBuddy son útiles para traducir expresiones de un sabor a otro para usted.

+0

Gracias por la información sobre ruby ​​regex, +1 – YOU

2

Si el sabor regex con el que está trabajando es compatible con \A, le recomiendo que siempre lo use en lugar de ^. \A siempre coincide al principio de la cadena solo en todos los sabores que la admiten. No hay problema con los saltos de línea.

^ puede coincidir al principio de la cadena solamente o al comienzo de cualquier línea, dependiendo del sabor de la expresión regular y de las opciones de expresiones regulares.

Al usar \A se reduce la posibilidad de confusión cuando alguien más tiene que mantener su código.

+0

Gracias por las sugerencias Jan Goyvaerts, eso tiene sentido – YOU

Cuestiones relacionadas