Regex convertit la chaîne en nombre valide, sans décimale, signe facultatif
-
05-07-2019 - |
Question
Je souhaite supprimer tout ce qui suit et après la décimale, ainsi que tout ce qui n'est pas numérique, sauf le trait d'union s'il s'agit du premier caractère. Jusqu'à présent, j'ai ceci: / [^ 0-9 ^ -] | [^ \.] + $ /
. Remarquez comment je bloque la suppression des tirets avec ^ -
, car je ne souhaite que supprimer les tirets qui ne sont pas le premier caractère (pas le signe). De l'aide? Merci.
Je veux juste qu'il supprime
- Tous les caractères autres que 0 à 9, à l'exception du premier caractère s'il s'agit d'un tiret (signe négatif)
- Tout ce qui suit et incluant le point décimal
Ex .:
10js-_67.09090FD
= > 1067
-10a.h96
= > -10
EDIT: Peu importe, j’abordais cette approche de la mauvaise façon, essayant de faire correspondre les caractères qui n’appartiennent pas, et j’ai réalisé que je ne devrais pas utiliser une regex pour cela. Merci pour vos réponses, j’en ai appris un peu sur la regex et peut-être que quelqu'un qui a un problème similaire va le trouver.
La solution
Essayez ceci:
Regex numbers = new Regex(@"^(-?\d*)[^0-9]*(\d*)\.",
RegexOptions.ECMAScript | RegexOptions.Multiline);
foreach (Match number in numbers.Matches("10js-_67.09090FD"))
{
Console.WriteLine(
Int32.Parse(
number.Groups[1].Value +
number.Groups[2].Value));
}
Ou celui-ci:
Console.WriteLine(
Int32.Parse(
Regex.Replace(
"10js-_67.09090FD",
@"^(-?\d*)[^0-9]*(\d*)\.([\s\S]*?)var re = /^(-?\d*)[^0-9]*(\d*)\.([\s\S]*?)$/
alert(parseInt("10js-_67.09090FD".replace(re, "$1$2"),10));
quot;, "$1$2",
RegexOptions.ECMAScript | RegexOptions.Multiline)));
Ou celui-ci:
<*>Autres conseils
Ce serait / ^ (-? [0-9] +) [^ 0-9 \.] * ([0-9] *). * $ / \ 1 \ 2 /
(à utiliser car vous ne me dites pas quelle langue utilisez-vous).
/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/
// '^' ==>l From the Start
// '(..)' ==>l Group 1
// '-?' ==>l An optiona '-'
// '[0-9]+' ==>l Some numbers
// '[^0-9\.]*' ==>l Anything but numbers and dot
// '(..)' ==>l Group 2 (So this is the number after the dot)
// '[0-9]*' ==>l Some numbers
// '.*
Ensuite, n'imprimez que les groupes 1 et 2 (/ \ 1 \ 2 /).
Tests:
$:~/Desktop$ echo "10js-_67.09090FD" | sed -r "s/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/"
1067
$:~/Desktop$ echo "-10a.h96" | sed -r "s/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/"
-10
J'espère que cela vous aidera
==>l The rest
Ensuite, n'imprimez que les groupes 1 et 2 (/ \ 1 \ 2 /).
Tests:
<*>J'espère que cela vous aidera