XRegExp 0.2:ahora con captura con nombre

Actualización: Esta versión de XRegExp está desactualizada. Ver XRegExp.com para la última y mejor versión.

El tipo de expresión regular de JavaScript no admite la captura con nombre. Bueno, dice quien? XRegExp 0.2 ofrece compatibilidad con la captura con nombre, junto con varias otras características nuevas. Pero antes que nada, si no ha visto la versión anterior, asegúrese de revisar mi publicación en XRegExp 0.1, porque no toda la documentación se repite a continuación.

Destacados

  • Completo soporte de captura con nombre (Nuevo)
  • Admite literales regex a través del addFlags método (Nuevo)
  • Modo de espacios libres y comentarios (x )
  • El punto coincide con todos los modos (s )
  • Varias otras mejoras menores sobre v0.1

Captura con nombre

Hay varias sintaxis diferentes en la naturaleza para la captura con nombre. Compilé la siguiente tabla según mi comprensión del soporte de expresiones regulares de las bibliotecas en cuestión. La sintaxis de XRegExp se incluye en la parte superior.

Biblioteca Capturar Atrásreferencia En reemplazo Almacenado en
XRegExp (<name>…) \k<name> ${name} result.name
.NET (?<name>…) (?'name'…) \k<name> \k'name' ${name} Matcher.Groups('name')
Perl 5.10 (beta) (?<name>…) (?'name'…) \k<name> \k'name' \g{name} $+{name} $+{name}
Python (?P<name>…) (?P=name) \g<name> result.group('name')
Preparado PHP (PCRE 7) (estilos .NET, Perl y Python) $regs['name'] $result['name']

Ninguna otra biblioteca de expresiones regulares importante actualmente admite la captura con nombre, aunque el motor JGsoft (utilizado por productos como RegexBuddy) admite la sintaxis de .NET y Python. XRegExp no usa un signo de interrogación al comienzo de un grupo de captura con nombre porque eso evitaría que se use en expresiones regulares literales (JavaScript arrojaría inmediatamente un error de "cuantificador no válido").

XRegExp admite la captura con nombre a pedido. Puede agregar soporte de captura con nombre a cualquier expresión regular mediante el uso del nuevo "k ". Esto se hace por razones de compatibilidad y para garantizar que el tiempo de compilación de expresiones regulares sea lo más rápido posible en todas las situaciones.

Los siguientes son varios ejemplos del uso de la captura con nombre:

// Add named capture support using the XRegExp constructor
var repeatedWords = new XRegExp("\\b (<word> \\w+ ) \\s+ \\k<word> \\b", "gixk");

// Add named capture support using RegExp, after overriding the native constructor
XRegExp.overrideNative();
var repeatedWords = new RegExp("\\b (<word> \\w+ ) \\s+ \\k<word> \\b", "gixk");

// Add named capture support to a regex literal
var repeatedWords = /\b (<word> \w+ ) \s+ \k<word> \b/.addFlags("gixk");

var data = "The the test data.";

// Check if data contains repeated words
var hasDuplicates = repeatedWords.test(data);
// hasDuplicates: true

// Use the regex to remove repeated words
var output = data.replace(repeatedWords, "${word}");
// output: "The test data."

En el código anterior, también he usado el x bandera proporcionada por XRegExp, para mejorar la legibilidad. Tenga en cuenta que el addFlags El método se puede llamar varias veces en la misma expresión regular (por ejemplo, /pattern/g.addFlags("k").addFlags("s") ), pero recomendaría agregar todas las banderas de una sola vez, para mayor eficiencia.

Aquí hay algunos ejemplos más del uso de captura con nombre, con una expresión regular de coincidencia de URL demasiado simplista (para un análisis completo de URL, consulte parseUri):

var url = "http://microsoft.com/path/to/file?q=1";
var urlParser = new XRegExp("^(<protocol>[^:/?]+)://(<host>[^/?]*)(<path>[^?]*)\\?(<query>.*)", "k");
var parts = urlParser.exec(url);
/* The result:
parts.protocol: "http"
parts.host: "microsoft.com"
parts.path: "/path/to/file"
parts.query: "q=1" */

// Named backreferences are also available in replace() callback functions as properties of the first argument
var newUrl = url.replace(urlParser, function(match){
	return match.replace(match.host, "yahoo.com");
});
// newUrl: "http://yahoo.com/path/to/file?q=1"

Tenga en cuenta que la funcionalidad de captura con nombre de XRegExp no es compatible con funciones de JavaScript obsoletas, incluido el lastMatch propiedad del RegExp global objeto y el RegExp.prototype.compile() método.

Modos de línea única (s) y extendido (x)

Las otras banderas no nativas que admite XRegExp son s (línea única) para el modo "punto coincide con todo" y x (extendido) para el modo "espacio libre y comentarios". Para obtener detalles completos sobre estos modificadores, consulte las preguntas frecuentes en mi publicación XRegExp 0.1. Sin embargo, una diferencia con la versión anterior es que XRegExp 0.2, al usar el x bandera, ahora permite espacios en blanco entre un token de expresión regular y su cuantificador (los cuantificadores son, por ejemplo, + , *? , o {1,3} ). Aunque el manejo/limitación de la versión anterior en este sentido estaba documentado, era atípico en comparación con otras bibliotecas de expresiones regulares. Esto ha sido arreglado.

Descargar

XRegExp 0.2.5 .

XRegExp se probó en IE 5.5–7, Firefox 2.0.0.4, Opera 9.21, Safari 3.0.2 beta para Windows y Swift 0.2.

Finalmente, tenga en cuenta que el XRE El objeto de v0.1 ha sido eliminado. XRegExp ahora solo crea una variable global:XRegExp . Para anular permanentemente el RegExp nativo constructor/objeto, ahora puede ejecutar XRegExp.overrideNative();

Actualización: Esta versión de XRegExp está desactualizada. Ver XRegExp.com para la última y mejor versión.