2009-05-01 15 views
19

Desde que comencé a escribir esta pregunta, creo que encontré las respuestas a cada pregunta que tenía, pero pensé que lo publicaría de todos modos, ya que podría ser útil para otros y podría aclarar más ser útil.Javascript no se dividirá usando regex

Estaba tratando de usar una expresión regular con lookahead con la función javascript dividida. Por alguna razón, no estaba dividiendo la cadena, aunque encuentra una coincidencia cuando llamo a Match. Originalmente pensé que el problema consistía en utilizar anticipación en mi expresión regular. Aquí es un ejemplo simplificado:

No funciona:

"aaaaBaaaa".split("(?=B)."); 

Obras:

"aaaaBaaaa".match("(?=B)."); 

Aparece fue que en el ejemplo de división, no estaba siendo interpretado la cadena pasada el problema como una expresión regular. Usar barras diagonales en lugar de comillas parece solucionar el problema.

"aaaaBaaaa".split(/(?=B)./); 

me confirmó mi teoría con el siguiente ejemplo parecer tonto:

"aaaaaaaa(?=B).aaaaaaa".split("(?=B)."); 

¿Alguien más piensa que es extraño que la función de concordancia asume que tiene una expresión regular, mientras que la función de división no es así?

+0

Siempre he usado la sintaxis/regex/(sin comillas) para todo: coincide, divide, reemplaza. No me di cuenta de que no era necesario en algunos casos. –

+2

En realidad, tiene sentido dejar que match() asuma una expresión regular (¿con qué * else * podría coincidir?) Y split() asumir una cadena, ya que la división en una cadena es probablemente más rápida que la división en una expresión regular.Solo si pasa una expresión regular real para dividir(), hará la división de expresiones regulares más lenta. – Tomalak

Respuesta

31

String.split acepta una cadena o expresión regular como su primer parámetro. El método String.match solo acepta una expresión regular.

Imagino que String.match intentará y trabajará con lo que pase; entonces, si pasa una cuerda, la interpretará como una expresión regular. El método String.split no tiene el lujo de hacerlo porque puede aceptar expresiones regulares Y cadenas; en este caso sería una tontería adivinar.


Editar: (De: "JavaScript: The Definitive Guide")

String.match requiere una expresión regular para trabajar con ellos. El argumento pasado debe ser un objeto RegExp que especifica el patrón que se emparejará. Si este argumento no es RegExp, primero se convierte en uno pasándolo al constructor RegExp().

3

Si recuerdo correctamente (y podría estar muy mal aquí), el método de división se implementó en javascript antes de que el motor de expresiones regulares se utilizara ampliamente, por lo que presumiblemente es por compatibilidad con versiones anteriores.

+1

Creo que esto es válido; String.split se introdujo en 1.1 y Regular Expressions en 1.2. Leyendo los documentos sobre 'split()' (aquí: http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/newfunc.htm), y las mejoras de expresiones regulares a 'split()' aquí: http : //web.archive.org/web/20010408055419/developer.netscape.com/docs/manuals/communicator/jsguide/js1_2.htm (sin enlace directo, busque en 'Expresiones regulares' -> 'Métodos de cadena' – Steen