Question

Je dois faire correspondre un nombre infini de chiffres dans une page Web.

Je dois pouvoir faire correspondre tous les formats suivants:

100 $
99$
$99
$ 8
$.99
$ .8
$ 99.8
.99$
.99 $
9.2 $
1.2$

Et l'équivalent en utilisant des virgules:

444,333
22,333
1,222
11,111,111
333,333,333,333.01132

Ou des espaces:

444 333
22 333
1 222
11 111 111
333 333 333 333.01132

C’est vraiment difficile pour moi. Je suis habitué à jouer avec regexp, mais j’ai totalement échoué à écrire quelque chose d’épreuve contre les balles. Généralement, http://www.regexlib.com a la solution, mais pas pour celle-ci.

Je ne vois pas d'autre moyen que d'utiliser regexp puisqu'il s'agit d'une recherche / remplacement de texte en clair.

Était-ce utile?

La solution

Voici une expression régulière qui correspond à tous les formats numériques que vous avez fournis:

^(?:\$\s*)?(?:(?:\d{0,3}(?:[, ]\d{0,3})*[, ])+\d{3}|\d+)(?:\.\d*)?(?:\s*\$)?$

Pour le décomposer:

  • ^ (?: \ $ \ s *)? recherchera un $ optionnel au début de la chaîne, suivi de toute quantité d'espaces
  • (?: (?: \ d {0,3} (?: [,] \ d {0,3]) * [,]) + \ d {3} | \ d *) correspondra à un nombre divisé en groupes séparés par une virgule ou un espace ( \ d {0,3} (?: [,] \ d {0,3}) * [,]) + \ d {3} ) ou une chaîne de nombres ( \ d + ) - 123, 567, 789, 123 456 789 et 123456789 seraient donc tous appariés. L'expression régulière n'acceptera pas les nombres mal groupés (donc 123,45,6789 ne seront pas appariés)
  • (?: \. \ d *)? fera correspondre un nombre avec une décimale facultative et un nombre quelconque de nombres après
  • (?: \ s * \ $)? $ correspondra à un $ optionnel à la fin de la chaîne, précédé d'une quantité d'espace quelconque.

Autres conseils

Pourquoi écrire 1 expression rationnelle, quand vous pouvez en écrire plusieurs et les appliquer à tour de rôle?

Je suppose (?) que vous pouvez parcourir ligne par ligne. Pourquoi ne pas essayer votre expression rationnelle, suivie de votre expression rationnelle, etc.? Si l’une concorde, alors ne cherchez pas le reste, enregistrez votre résultat et passez à la ligne suivante.

Qu'en est-il de le faire en 2 étapes:

remplacez d'abord tous les espaces par ''

alors, si le formatage numérique est toujours le même, vous pouvez remplacer les virgules par ''

après, c'est assez facile, non?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top