0
votes

Regex pour valider et extraire des données d'un calcul

J'essaie de trouver une expression régulière où je peux valider l'entrée et extraire des informations requises à partir de l'entrée.

Mon entrée contient un calcul simple, de la soustraction, de la multiplication et de la division.
>

Par exemple: Si l'entrée est addition, indiquez 7.01 + 9,05 xxx

J'ai utilisé l'expression régulière que j'ai trouvée à partir de ce message: Calculatrice Expression régulière avec point décimal et signe moins

Pouvez-vous aider à extraire les données requises dans le code ci-dessus? < / p>


2 commentaires

L'utilisation de Regex pour analyser une expression arithmétique est une idée généralement mauvaise. Vous allez également venir à cette conclusion dès que vous avez des termes imbriqués entre parenthèses. Au lieu de cela, je recommande d'écrire un analyseur.


@TimbieGeleisen Ma nécessité est de simplement trouver des éléments de base avec 2 valeurs et un signe entre eux, je ne veux pas utiliser des éléments imbriqués.


3 Réponses :


1
votes

Vous pouvez le faire en utilisant Split () Code>

p>

var input = '7.01+9.05';

var pattern = /^-?\d+\.?\d+[-+*\/]-?\d+\.?\d+$/
if (input.match(pattern)) {
    var matches = pattern.exec(input)[0].split(/(\+|-|\*|\/)/);

    var left = matches[0];
    var right = matches[2];
    var sign = matches[1];
    console.log(left,sign,right);
}


3 commentaires

Merci, mais je veux essayer avec des expressions régulières


@learner j'ai fait cela avec des expressions régulières. Vous voulez sans eux?


Je veux savoir comment accéder aux données à l'aide de la variable correspondante dans mon programme.



1
votes

Bien sûr!

Vous devez définir des groupes de capture dans votre expression de regex à l'aide de () et | . Il est important de définir un drapeau global à votre regex pour capturer tous les groupes.

Il y a 3 choses que vous devez capturer:

  • Le numéro gauche -> ^ -? \ d + \.? \ d +
  • Le signe -> [- + * \ /]
  • le bon numéro -> -? \ d + \.? \ d + $

    Vous devez utiliser | Alternation à regex Utilisez les groupes de capture tels que A ou la relève Betwen Beetwen Les groupes.

    Le regex final sera: xxx

    Le résultat de la sortie sera un tableau dans lequel la première position sera le numéro gauche, deuxième position du signe et la troisième position un numéro droit.

    donc le reste de votre code ressemble à celui: xxx


2 commentaires

Je pense que nous devons supprimer "|" Pour l'expression régulière, il devrait être: ^ (-? \ d + \.? \ d +) ([- + * \ \ /]) (-? \ d + \.? \ d +) $ ; parce que / (^ -? \ d + \.? \ d +) | ([- + * \ \ /]) | (-? \ d + \.? \ d + $) / g correspondra 4.05 et 4.05 + 9.01 et +9.01


Ce n'est pas nécessaire car je suggère d'utiliser entrée.Match (motif) . Par conséquent, si vous utilisez motif.exec (entrée) nous shold retirez le tuyau | .



1
votes

dans votre motif ^ -? \ d + \.? \ d + [- + * \ \ /] -? \ d + \.? \ d + $ code> Vous souhaitez correspondre à un point facultatif en utilisant \ d + \.? \ d + code> qui fonctionne, mais maintenant le nombre minimum de chiffres à assortir est 2 en raison de la correspondance 2 fois 1 ou plusieurs chiffres utilisant \ d + code> donc 1 + 1 ne serait pas Match.

Ce que vous pouvez faire si ce ne sont que des calculs simples, vous pouvez utiliser 3 groupes de capture et correspondre à un chiffre avec une partie décimale optionnelle à l'aide de ? \ d + (?: \. \ d +)? Code > p>

Votre motif pourrait ressembler à: p> xxx pré>

explication forte> p>

  • ^ code> début de chaîne li>
  • (-? \ d + (?: \. \ d +)?) Code> Capture Group 1, Match 1+ chiffres avec une partie décimale optionnelle li>
  • ([- + * \ /]) code> Capture Group 2, correspond à l'un des éléments répertoriés dans la classe de caractères li>
  • (- \ d + (?: \. \ d +)?) Code> Capture Group 2, Match 1+ chiffres avec une partie décimale optionnelle li>
  • $ code> fin de chaîne li> ul>

    Voir le Démo REGEX101 P>

    Par exemple p>

    p>

    var regex = /^(-?\d+(?:\.\d+)?)([-+*\/])(-?\d+(?:\.\d+)?)$/;
    [
      "21+22",
      "7.01+9.05",
      "1-1",
      "1*1",
      "0*1000000",
      "8/4"
    ].forEach(x => {
      var res = x.match(regex);
      var left = res[1];
      var right = res[2];
      var sing = res[3];
      console.log(left, right, sing);
    });


0 commentaires