2011-03-25 26 views
8

Buscando ayuda para hacer coincidir los corchetes en un patrón de expresión regular. He intentado diferentes combinaciones de escapes y coincidencia de símbolos con poca suerte. Quizás porque es viernes por la tarde y estoy pasando por alto algo; pero sus ideas serán muy apreciadas. El código de abajo:Corchete rizado coincidente

function stringFormat(str, arr) { 
    for (var i = 0; i < arr.length; i++) { 
     var regExp = new RegExp('^\{' + i + '\}$', 'g'); 
     str = str.replace(regExp, arr[i]); 
    } 
    return str; 
} 

var str = '<p>The quick {0}, brown {1}</p>'; 

$('#test').html(stringFormat(str, ['brown', 'fox'])); 

También he comenzado un violín en esto, http://jsfiddle.net/rgy3y/1/

+0

Eso parece correcto ... –

Respuesta

14

En lugar de tratar de coincidir con un montón de diferentes números, ¿por qué no hacerlo todo de una sola vez:

function stringFormat(str, arr) { 
    return str.replace(
     /\{([0-9]+)\}/g, 
     function (_, index) { return arr[index]; }); 
} 

En su ejemplo,

var str = '<p>The quick {0}, brown {1}</p>'; 

// Alerts <p>The quick brown, brown fox</p> 
alert(stringFormat(str, ['brown', 'fox'])); 

Esto tiene la ventaja de que nada ocurrirá raro si arr contiene una cadena como '{1}'. P.ej.
stringFormat('{0}', ['{1}', 'foo']) === '{1}' constantemente en lugar de 'foo' al igual que con la versión fija de la original, pero incompatible con stringFormat('{1}', ['foo', '{0}']) === '{0}'

+0

Gracias Mike. Apreciar la recomendación y resolver posibles problemas en el futuro. – gnome

+0

Tomé su función de formato pero la agregué como un método estático a 'String' y usé la matriz' arguments' en lugar de que el usuario pasara una matriz. http://codetunnel.com/blog/post/string-replacement-is-natively-supported-by-consolelog – Chev

+0

Tu enlace parece estar abajo @Chev. Solo un recordatorio amigable: 'arguments' no es una matriz. –

6

Para obtener una \ en una cadena literal que necesita escribir \\. En particular, '\{' == '{'. Quiere '\\{'.

+0

Tienes razón (la!). Sabía que era viernes por la tarde :-) – gnome

0

No estoy familiarizado con javascript (o lo que sea) regex, pero solo está haciendo coincidir expresiones que contienen solo {X} (o solo líneas con esa expresión, de nuevo dependiendo de su expresión regular).
'^ {' + i + '} $'

Retire el^$ e.

Cuestiones relacionadas