2012-03-08 15 views
5

Estoy tratando de tomar el valor de un campo de texto de entrada y usarlo dentro de una expresión regular. Esto es lo que tengo que hacer coincidir con el comienzo de una línea.Escapar una variable dentro de una expresión normal

regex = new RegExp('^' + inputValue, 'i') 

Funciona bien para las cadenas regulares que empiezan tienen caracteres alfanuméricos, pero yo estoy usando esto para las cantidades en dólares también. Cuando el campo de entrada comienza con un '$' (signo de dólar) obtengo resultados variables.

¿Cómo puedo escapar de la variable anterior para verla como una cadena simple? He intentado esto, pero no hubo suerte:

regex = new RegExp('^[' + inputValue + ']', 'i') 
+0

PHP tiene 'preg_quote ', No creo que JavaScript tenga uno. La función PHP escapa '. \ + *? [^] $() {} =! < > | : -', así que supongo que 'reemplace' estos con sus versiones de escape. –

+2

Mire la respuesta en esta pregunta http://stackoverflow.com/questions/3614440/replicate-the-functionality-of-javas-pattern-quote-in-a-javascript-regexp – Danny

+1

[This] (http: // simonwillison.net/2006/Jan/20/escape/#p-6) quizás. – pimvdb

Respuesta

3

Probablemente una de las mejores implementaciones que he visto

http://phpjs.org/functions/preg_quote:491

copiado a continuación para la posteridad

function preg_quote (str, delimiter) { 
    // Quote regular expression characters plus an optional character 
    // 
    // version: 1109.2015 
    // discuss at: http://phpjs.org/functions/preg_quote // + original by: booeyOH 
    // + improved by: Ates Goral (http://magnetiq.com) 
    // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) 
    // + bugfixed by: Onno Marsman 
    // + improved by: Brett Zamir (http://brett-zamir.me) // *  example 1: preg_quote("$40"); 
    // *  returns 1: '\$40' 
    // *  example 2: preg_quote("*RRRING* Hello?"); 
    // *  returns 2: '\*RRRING\* Hello\?' 
    // *  example 3: preg_quote("\\.+*?[^]$(){}=!<>|:"); // *  returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:' 
    return (str + '').replace(new RegExp('[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\' + (delimiter || '') + '-]', 'g'), '\\$&'); 
} 
1

$ coincide con el final de una línea, por lo que si inputValue comienza con $, que está buscando coincidencias como ^$9.99, lo que obviamente suele responden a nada porque puede 9.99 Viene DESPUÉS del final de una línea.

si $ es el único personaje que te preocupa, sólo se puede ejecutar a través de un inputValue buscar/reemplazar de manera que se escaparon a $\$.

0

¿No pensó en solo comprobar si la secuencia comienza con su entrada con indexOf?

Do it in siguiente manera:

var inputValue = "some"; 
if ("some string".indexOf(inputValue.toLowerCase()) == 0) { 
    // test passed 
} 
Cuestiones relacionadas