2009-04-20 6 views
0

Mes amis,Utilisation d'expressions régulières avec la méthode de remplacement Javascript

Je suis nouveau aux expressions Javascript et régulières et j'espère que vous pouvez aider!

Dans une fonction Javascript, j'ai besoin de vérifier si une virgule (,) apparaît 1 fois ou plus. Si c'est le cas, il devrait y avoir un ou plusieurs nombres de chaque côté.

par exemple.

1,000.00 est ok

1,000,00 est ok

, 000.00 n'est pas correct

1,, 000.00 n'est pas correct

Si ces conditions sont remplies, je veux que la virgule être enlevé si 1000.00 devient 1000.00

Ce que j'ai essayé est:

var x = '1,000.00'; Var regex = new RegExp ("[0-9] +, [0-9] +", "g");

var y = x.réplace (regex, "");

alerte (y);

Lors de l'exécution, l'alerte affiche ".00" Ce qui n'est pas ce que j'attendais ou ce que je voulais!

Merci d'avance pour toute aide fournie.

forte texte Modifier forte texte

Merci à tous pour l'entrée à ce jour et les 3 réponses. Malheureusement, je ne pense pas avoir suffisamment expliqué ma question.

Ce que je suis en train de réaliser est:

S'il y a une virgule dans le texte et il y a un ou plusieurs numéros de chaque côté de celui-ci, puis retirez la virgule, mais laisser le reste de la chaîne comme il est.

S'il y a une virgule dans le texte et qu'il n'y a pas au moins un chiffre de chaque côté, alors ne faites rien.

Donc, en utilisant mes exemples de ci-dessus:

1.000,00 devient 1000,00

1,000,00 devient 100000

, 000.00 est laissée, 000.00

1,, 000.00 est laissée 1 ,, 000,00

Toutes mes excuses pour la confusion!

+0

Quel est le problème avec juste enlever tous des virgules dans la chaîne ... String.replace (',', ''); – James

+0

Merci pour le commentaire Jimmy. C'était ma première solution aussi! Malheureusement, certains champs autorisent l'inclusion de virgules dans le formatage. Donc avant que je laisse l'utilisateur quitter le champ et ils ont entré une virgule alors il doit y avoir au moins un nombre de chaque côté. Fondamentalement, pour empêcher les utilisateurs d'entrer 1 ,,,,,,,,,,,,,,,, 000 etc. –

Répondre

4

Votre regex ne va pas être très flexible avec des ordres supérieurs à 1000 et elle a un problème avec les entrées qui n'ont pas la virgule.Plus problématique, vous faites également correspondre et remplacer la partie des données qui vous intéresse!

Mieux vaut avoir une regex qui correspond aux formes qui posent problème et les supprimer.

Les correspondances suivantes (dans l'ordre) sont des virgules au début de l'entrée, à la fin de l'entrée, précédées d'un nombre de non-chiffres, ou suivies d'un nombre de non-chiffres.

var y = x.replace(/^,|,$|[^0-9]+,|,[^0-9]+/g,''); 

En aparté, tout cela est beaucoup plus facile si vous arrive d'être en mesure de faire lookbehind mais presque tous les JS mise en œuvre ne fonctionne pas.

Modifier basé sur la mise à jour de question:

Ok, je ne vais pas essayer de comprendre pourquoi vos règles sont comme elles sont, mais l'expression régulière devient plus simple à résoudre:

var y = x.replace(/(\d),(\d)/g, '$1$2'); 
+3

Vous pouvez simuler un lookbehind en inversant la chaîne et en faisant un lookahead ... – James

+0

Bien sûr, bon point, mais le OP devrait faire les deux lookahead et retour. Vous pourriez l'évaluer s'il était important, mais je pense que plusieurs opérations seraient plus clunkieur que l'expression régulière ci-dessus. – annakata

+0

Salut annakata, Merci pour les solutions - le second était exactement ce dont j'avais besoin. Merci encore! Cordialement Ian –

2

I utiliserait quelque chose comme ce qui suit:

^[0-9]{1,3}(,[0-9]{3})*(\.[0-9]+)$ 
  • [0-9] {1,3}: 1 à 3 chiffres s
  • (, [0-9] {3}) *: [Facultatif] Plus de triplés chiffres séparés par une virgule
  • (\ [0-9] +.): [en option] Dot + plus de chiffres

Si cette expression rationnelle correspond, vous savez que votre numéro est valide. Remplacez simplement toutes les virgules par la chaîne vide après.

+0

Bonne réponse, commencez par vérifier l'exactitude de votre numéro. Une fois cela fait, il vous suffit de supprimer toutes les virgules ... –

1

Il me semble que vous avez trois conditions d'erreur

  1. », 1000"
  2. "1000,"
  3. "1, 000"

Si l'un de ces est vrai alors vous devriez rejeter le champ, si elles sont toutes fausses, alors vous pouvez enlever les virgules de la manière normale et passer à autre chose. Cela peut être une simple alternance:

^,|,,|,$ 
+0

solution très intelligente – dfa

1

Je voudrais juste enlever quoi que ce soit, sauf les chiffres et le séparateur décimal ([^0-9.]) et envoyer la sortie par parseFloat():

var y = parseFloat(x.replace(/[^0-9.]+/g, "")); 
1
// invalid cases: 
// - standalone comma at the beginning of the string 
// - comma next to another comma 
// - standalone comma at the end of the string 
var i, 
    inputs = ['1,000.00', '1,000,00', ',000.00', '1,,000.00'], 
    invalid_cases = /(^,)|(,,)|(,$)/; 
for (i = 0; i < inputs.length; i++) { 
    if (inputs[i].match(invalid_cases) === null) { 
     // wipe out everything but decimal and dot 
     inputs[i] = inputs[i].replace(/[^\d.]+/g, ''); 
    } 
} 
console.log(inputs); // ["1000.00", "100000", ",000.00", "1,,000.00"] 
Questions connexes