2010-09-30 9 views
13

Según mi investigación, parece que las expresiones regulares de Javascript no tienen ningún equivalente incorporado al modificador de Perl/x, o el modificador RegexOptions.IgnorePatternWhitespace de .NET. Estos son muy útiles ya que pueden hacer que una expresión regular compleja sea mucho más fácil de leer. En primer lugar, ¿me he perdido algo y hay un Javascript incorporado equivalente a estos? En segundo lugar, si no existe, ¿alguien sabe de un buen complemento de jQuery que implementará esta funcionalidad? Es una pena tener que comprimir mi expresión regular compleja en una sola línea debido a las aparentes limitaciones de expresiones regulares de Javascript.Ignorando el espacio en blanco en los patrones de expresiones regulares de Javascript?

+0

¿Por qué usar jQuery? jQuery no es la única forma de importar código externo. –

Respuesta

14

Si le entiendo correctamente, ¿quiere agregar un espacio en blanco que no forme parte de la expresión regular? Por lo que yo sé, no es posible con expresiones regulares regulares.

Ejemplo:

var a = /^[\d]+$/ 

Puede dividir la expresión regular en varias líneas de la siguiente manera:

var a = RegExp(
    "^" + 
    "[\\d]+" + // This is a comment 
    "$" 
); 

en cuenta que puesto que ahora es una cadena normal, usted tiene que escapar \ con \\

O si tiene una compleja:

var digit_8 = "[0-9]{8}"; 
var alpha_4 = "[A-Za-z]{4}"; 
var a = RegExp(
    digit_8 + 
    alpha_4 + // Optional comment 
    digit_8 
); 

Actualización: El uso de una matriz temporal para concatenar la expresión regular:

var digit_8 = "[0-9]{8}"; 
var alpha_4 = "[A-Za-z]{4}"; 
var a = RegExp([ 
    digit_8, 
    alpha_4, // Optional comment 
    digit_8, 
    "[0-9A-F]" // Another comment to a string 
].join("")); 
+2

Sí, pero no es lo mismo. Tiene la fea sintaxis de concatenación de cadenas adicionales de Javascript, y todavía no puede poner comentarios al estilo Perl al final de las líneas, como: h (a | o) t # <- coincide con hat o hot – Jez

+2

@Jez: Pero puedes poner comentarios de JavaScript allí. No hay otra forma, lamentablemente. JS no admite expresiones regulares. –

+4

JavaScript no es perl. – Incognito

8

desafortunadamente no hay tal opción en la ES5, y sospecho que es poco probable que sea nunca en RegExp literales, porque ya son muy difícil de analizar y los saltos de línea los harían aún más ambiguos.

Si desea un fácil escapado y resaltado de sintaxis de literales RegExp, puede unirlos aprovechando la propiedad source. No es perfecto, pero en mi humilde opinión menos malo que caer todo el camino de vuelta a cadenas:

new RegExp(
    /foo/.source + 
    /[\d+]/.source + 
    /bar/.source 
); 

En ES6 puede crear su propia cadena de plantilla:

regexp` 
    foo 
    [\d+] 
    bar 
`; 

function regexp(parts) { 
    // I'm ignoring support for ${} placeholders for brevity, 
    // but full implementation should escape them. 

    // Note that `.raw` allows use of \d instead of \\d. 
    return new RegExp(parts.raw.join('').replace(/\s+/g,'')); 
} 
Cuestiones relacionadas