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. P>
Par exemple: Si l'entrée est addition, indiquez 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 P> Pouvez-vous aider à extraire les données requises dans le code ci-dessus? < / p> p>
3 Réponses :
Vous pouvez le faire en utilisant p> Split () Code> 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);
}
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.
Bien sûr!
Vous devez définir des groupes de capture dans votre expression de regex à l'aide de Il y a 3 choses que vous devez capturer: p> Vous devez utiliser Le regex final sera: P> 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. p> donc le reste de votre code ressemble à celui: p> () code> et | code>. Il est important de définir un drapeau global à votre regex pour capturer tous les groupes. P>
^ -? \ d + \.? \ d + code> li>
[- + * \ /] code> li>
-? \ d + \.? \ d + $ code> li>
ul> | code> Alternation à regex Utilisez les groupes de capture tels que A ou la relève Betwen Beetwen Les groupes. P>
Je pense que nous devons supprimer "|" Pour l'expression régulière, il devrait être: ^ (-? \ d + \.? \ d +) ([- + * \ \ /]) (-? \ d + \.? \ d +) $ code>; parce que / (^ -? \ d + \.? \ d +) | ([- + * \ \ /]) | (-? \ d + \.? \ d + $) / g code> 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) code>. Par conséquent, si vous utilisez motif.exec (entrée) code> nous shold retirez le tuyau | code>.
dans votre motif 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 Votre motif pourrait ressembler à: p> explication forte> p> Voir le Démo REGEX101 P> Par exemple p> p> ^ -? \ 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. ? \ d + (?: \. \ d +)? Code > 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> 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);
});
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.