2012-01-26 2 views
2

J'ai hérité de cette regex javascript d'un autre développeur et maintenant, même si rien n'a changé, il ne semble pas correspondre au texte requis. Voici la regex:Pourquoi l'écriture régulière échoue-t-elle lorsque l'entrée contient un saut de ligne?

/^.*(already (active|exists|registered)).*$/i 

je en ai besoin pour correspondre à tout texte qui ressemble à

choses stuff existe déjà plus de choses etc

Il semble parfaitement bien pour moi, il ne cherche ces deux mots ensemble et devrait en théorie ignorer le reste de la chaîne. Dans mon scénario, je vérifie le texte comme celui-ci

var cardUsedRE = /^.*(already (active|exists|registered)).*$/i; 
if(cardUsedRE.test(responseText)){ 
    mdiv.className = 'userError'; 
    mdiv.innerHTML = 'The card # has already been registered'; 
    document.getElementById('cardErrMsg').innerHTML = arrowGif; 

}

Je suis dans ce entrai par Firebug et je l'ai vu ne parviennent pas à tester cette chaîne:

> Error: <detail>Card number already registered for CLP.\n</detail> 

Am I Il manque quelque chose? Quel est le problème probable avec cela?

+0

'.' ne correspondra pas * à une nouvelle ligne par défaut. En outre, "" est probablement mieux écrit que "\ s +" –

+0

Pas sûr si elle est liée, mais il semble que votre javascript a une faute de frappe sur la ligne avec mdiv.innerHTML = ... – JayC

+1

Je suis également d'accord avec pst. Je ne sais pas pourquoi vous avez même les bits ^. * Et. * $ À moins que ce soit un rappel pour ancrer au début et à la fin quand toute la chaîne doit correspondre à quelque chose. – JayC

Répondre

3

est ici une expression régulière simplifiée mais fonctionnellement équivalent qui devrait gérer les nouvelles lignes:

/(already\s+(active|exists|registered))/i

Je ne sais pas pourquoi vous avez toujours voulu conduire avec ^.* ou se terminer par .*$ à moins que votre objectif est précisément d'éviter les sauts de ligne . Sinon, c'est juste superflu.

EDIT: Je remplacé l'espace avec \s+ il sera plus libéral avec la façon dont il gère les espaces (par exemple un espace, deux espaces, un onglet, etc. doit tout le match).

+1

Merci cela résolu le problème. – Rondel

2

tldr; Utilisez le modificateur m pour que les lignes . correspondent aux nouvelles lignes. Voir le MDC regular expression documentation.

A défaut (notez le "\ n" dans la chaîne littérale):

var str = "Error: <detail>Card number already registered for CLP.\n</detail>" 
str.match(/^.*(already (active|exists|registered)).*$/i) 

travail (note m drapeau pour "multi-ligne" comportement de .):

var str = "Error: <detail>Card number already registered for CLP.\n</detail>" 
str.match(/^.*(already (active|exists|registered)).*$/mi) 

Je voudrais utilisez une forme plus simple, cependant: (Ajustez la définition de «espace».)

var str = "Error: <detail>Card number already registered for CLP.\n</detail>"; 
str.match(/(?:already\s+(?:active|exists|registered))/i) 

Codage heureux .

+0

Merci pour les informations supplémentaires. Je n'ai pas réalisé que le retour à la ligne causerait d'autres problèmes – Rondel

Questions connexes