2010-11-06 9 views
9

Parece que recibo consejos contradictorios en los libros que leo en esta funcionalidad. Me pregunto si alguien podría aclarar. Por ejemplo Nicholas Zakas establece el argumento de la función tiene una firma de la función de formato (partido, pos, Originaltext) (P139: Pro JavaScript para desarrolladores web 2ª ed: Wrox)JavaScript String Reemplazar con expresión regular y función como argumentos

Él va a decir cuando la expresión regular tiene una coincidencia, la función se pasa tres argumentos (como arriba). Cuando hay múltiples grupos de captura, cada cadena coincidente se pasa como un argumento, con las dos últimas posiciones siendo la posición original y texto ...

Luego llegamos a Doug Crockfords, JavaScript: The Good Parts. (P90): Él estipula la sintaxis de nuevo como una cadena (searcValue, replaceValue) searchValue puede ser una expresión regular - excelente coincidencia .. si replaceValue es una función, el primer parámetro es el texto coincidente, luego el segundo es el grupo de captura 1 , el tercero es el grupo de captura 2 y así sucesivamente. Aquí hay una diferencia notable. (es decir, sin argumento de posición)

También estaba viendo un ejemplo en los patrones de diseño Pro JavaScript (APress P152) que inició todo este proceso de referencias cruzadas. Estos muchachos (Ross Harmes/Dustin Diaz), más bien especifican inútilmente la función replaceValue con dos argumentos llamados & b. Pero tiende a reforzar la noción que describe Doug Crockford.

¿Alguien puede confirmar si la descripción de Nicholas Zakas es de hecho una opción válida también?

Respuesta

8

Zakas es correcto, los argumentos penúltimo y final son pos y originalText. A partir de los ECMA-262 3rd y 5th ediciones (sección 15.5.4.11):

Si replaceValue es una función, entonces para cada subcadena coincidente, llamar a la función con las siguientes m + 3 argumentos. El argumento 1 es la subcadena que coincidió. Si searchValue es una expresión regular, los siguientes argumentos m son todas las capturas en MatchResult (consulte 15.10.2.1). Argumento m + 2 es el desplazamiento dentro de la cadena donde se produjo la coincidencia, y el argumento m + 3 es string.

Tenga en cuenta que String.prototype.replace era nuevo en ECMA-262 3rd edition. La documentación de MSDN para la documentación de JScript y MDC para JavaScript se ajusta a esta especificación.

+0

Gracias por los enlaces y. El Moziila en particular fue genial. – JGFMK

4

La especificación ECMAScript tiene:

String.prototype.replace (searchValue, replaceValue) 

Si searchValue es una expresión regular (un objeto cuya [[Clase]] propiedad es "RegExp "), haga lo siguiente: Si searchValue. global es falso, luego cadena de búsqueda para la primera coincidencia de la expresión regular searchValue. Si searchValue.global es verdadero, luego cadena de búsqueda para todas las coincidencias de la expresión regular searchValue. Realice la búsqueda de la misma manera que en String.prototype.match, incluida la actualización de searchValue. lastIndex. Deje m ser el número de paréntesis de captura izquierda en searchValue (NCapturingParens como se especifica en 15.10.2.1).

Si searchValue no es una expresión regular, permita que searchString sea ToString (searchValue) y busque la primera aparición de searchString. Deje m ser 0.

Si replaceValue es una función, para cada subcadena coincidente, llame a la función con los siguientes argumentos m + 3. El argumento 1 es la subcadena que coincidió. Si searchValue es una expresión regular, los siguientes m argumentos son todas las capturas en MatchResult (ver 15.10.2.1). El argumento m + 2 es el desplazamiento dentro de la cuerda donde ocurrió la coincidencia, y el argumento m + 3 es la cadena. El resultado es un valor de cadena derivado de la entrada original al reemplazar cada subcadena coincidente con el valor de retorno correspondiente de la llamada a función, convertida a una cadena si es necesario.

Es un poco confuso, pero creo que Zakas tiene razón.

+0

Gracias por responder. ¿Tienes un enlace a la especificación? – JGFMK

+0

http://bclary.com/2004/11/07/ para rev 3 html. el sitio oficial es http://www.ecmascript.org/docs.php –

+0

¡Salud! – JGFMK

Cuestiones relacionadas