2009-01-27 16 views

Respuesta

6

No hay ninguna razón técnica por la que tenga que ser así.

Como se señala en un comentario, la biblioteca subyacente no requiere que las banderas se pasen como parte de la expresión regular - de hecho, la extensión tiene que quitarlas y pasarlas como un argumento separado.

Parece que el implementador original intentaba hacer que se viera como grep/sed/awk/perl/etc, por lo que es más familiar para los programadores que provienen de esas herramientas.

+4

PCRE no permite los delimitadores circundantes en absoluto. Las funciones de preg de PHP las quitan antes de pasarlas a la biblioteca PCRE. –

+2

wow, ¿entonces todo es puro intento de ser perl? He perdonado la sintaxis durante años, pero ahora soy libre de odiarlo de verdad. ¡Gracias! – Cal

+0

Esta respuesta está bien para la opinión personal, pero no es correcta. – dreftymac

15

El motivo del delimitador es poner banderas después del patrón. Podría decirse que las banderas podrían pasarse como un parámetro separado (Java puede hacerlo de esta manera) pero así es como Perl lo hizo originalmente (y sed/awk/vi antes), así es como se hace ahora.

No utilice barras diagonales: son demasiado comunes. Personalmente, casi siempre uso el! personaje. Casi nunca estoy buscando eso.

+1

Nota: Java también puede incluir indicadores dentro de la expresión regular, al principio (? M) para varias líneas, por ejemplo. (? s) para dotall, (? ms) para ambos, y así sucesivamente. – VonC

+0

@VonC, también lo puede hacer Python. –

+0

También lo pueden hacer Perl, PCRE e incluso las funciones de preg de PHP. Pero las funciones de preg tienen algunos indicadores adicionales que solo se pueden especificar después de la expresión regular. –

6

No sé cuáles fueron los motivos de los desarrolladores de las funciones de preg. La única razón por la que puedo pensar es que trataron un poco demasiado duro para hacer las cosas al estilo Perl.

Mientras que los delimitadores permiten especificar indicadores junto con la expresión regular como un parámetro, especificar los indicadores como un parámetro separado es mucho más claro. Así es como cada otra biblioteca de expresiones regulares (para lenguajes que no admiten expresiones regulares literales como característica de idioma) sé que lo hace, incluida la biblioteca PCRE en la que se basan las funciones de preg de PHP. El código de preg de hecho tiene que pasar por la dificultad de eliminar los delimitadores de expresiones regulares de la cadena con su expresión regular antes de que pueda pasar a PCRE.

Cuestiones relacionadas