2011-03-16 11 views
5

que tienen una función que corrige la capitalización de una lista de palabras inusualmente capitalizadas:Regexp de JavaScript.

var line = "some long string of text"; 
["AppleScript", "Bluetooth", "DivX", "FireWire", "GarageBand", 
"iPhone", "iTunes", "iWeb", "iWork", "JavaScript", "jQuery", "MacBook", 
"MySQL", "PowerBook", "PowerPoint", "QuickTime", "TextEdit", "TextMate", 
// ... 
"Wi-Fi", "Xcode", "Xserve", "XMLHttpRequest"].forEach(function(name) { 
     line = line.replace(RegExp(name, "gi"), name); 
}); 

Ahora el problema que estoy enfrentando es que la mayoría de las cadenas de entrada contendrán una media de entre 0 y 3 de estas palabras. Obviamente ahora estoy haciendo docenas (y potencialmente cientos, esa matriz tiene una extraña tendencia a crecer con el tiempo) de llamadas a funciones que esencialmente no hacen nada.

¿Cómo puedo hacer que este código sea más rápido y deshacerme de las llamadas a funciones innecesarias?

Ejemplo de entrada:

Mi aplicación iPhone tiene una forma de usuario bajo UIViewController. Cuando inicio la aplicación otra vez, algunos de mis UIView cambian sus posiciones y tamaños. (Estas UIView dependen de la posición del teclado) En algún lugar es definitivamente mi culpa. Intento entender qué sucede cuando la aplicación se inicia nuevamente desde el fondo y donde se pueden realizar los cambios de UIView.

+0

las llamadas no son innecesarias ¿verdad? Si desea marcar con mayúscula cada cadena, deberá verificar cada una de ellas ... El hecho de que no exista no significa que la verificación no fue necesaria ... –

+0

@Sam Pero es necesario durante el toda la entrada? ¿O podría redactarse una expresión regular más inteligente que hiciera todos los controles en una llamada a función? –

+0

bien, veo tu punto. –

Respuesta

5

Puede compilar expresiones regulares que contengan todas sus palabras, capturando cada palabra encerrándola entre paréntesis. Usar eso en un reemplazo proporcionará suficiente información para recuperar la palabra original en la función de reemplazo.

function correct (text, words) { 
    return text.replace (RegExp ('\\b(?:(' + words.join (')|(') + '))\\b', 'ig'), function (m) { 
     for (var a = arguments.length - 2; a--;) 
     if (arguments[a]) 
     return words[a-1] || m; 
    }); 
    } 

    console.log (correct ("My iphone itunes divx firewire application has a user form under uiviewcontroller. When I start application again some of my uiview changes its positions and sizes. (These uiviews depend on keyboard position) Somewhere is definitely my fault. I try to figure what is going on when application starts again from background and where the uiview changes can be done.", 
    ["AppleScript", "Bluetooth", "DivX", "FireWire", "GarageBand", 
"iPhone", "iTunes", "iWeb", "iWork", "JavaScript", "jQuery", "MacBook", 
"MySQL", "PowerBook", "PowerPoint", "QuickTime", "TextEdit", "TextMate", 
// ... 
"UIViewController","UIView", 
"Wi-Fi", "Xcode", "Xserve", "XMLHttpRequest"])); 
My iPhone iTunes DivX FireWire application has a user form under UIViewController. When I start application again some of my UIView changes its positions and sizes. (These UIViews depend on keyboard position) Somewhere is definitely my fault. I try to figure what is going on when application starts again from background and where the UIView changes can be done. 

This turns out to be faster then the original code.

+0

Ahora, ¿será más rápido que el código que tengo ahora? ¿Por qué? –

+0

El número de llamadas de función que esto hace es 2 + (number_of_words_replaced). El resto del trabajo pesado se realiza mediante funciones internas rápidas. Puede eliminar la construcción de expresiones regulares en cada llamada si la matriz de palabras está estática – HBP

+1

La expresión regular necesita modificarse ligeramente porque luego coincide con las palabras: 'RegExp ('\\ b (? :(' + words.join (') | (') +')) \\ b ',' ig ') 'hace el truco. –

Cuestiones relacionadas