Je ne peux pas pour la vie de moi comprendre pourquoi l'expression rationnelle suivante ne peut pas correspondre à 4 flotteurs. Il y a quelques règles pour la façon dont les flottants peuvent être écrits.RegEx correspondant 4 flotteurs
- le flotteur varie de 0 à 1
- vous pouvez sauter le premier chiffre 0 si son
- il y a un nombre illimité de chiffres après la période.
Theese sont valides flotteurs
- 1,0
- 0,0
- .0
- 0,123
- .123
Maintenant, pour le code que j'ai essayé entre autres
string input = " 0 0 0 .4";
string regex = @"[0-1]*(\.[0-9]*)*\s[0-1]*(\.[0-9]*)*\s[0-1]*(\.[0-9]*)*\s[0-1]*(\.[0-9]*)*";
Regex r = new Regex(regex, RegexOptions.Compiled);
Match m = r.Match(input);
m.Value Returns "0 0 0" où je pense à revenir "0 0 0 0,4"
J'ai essayé
[0-1]{0,1}(\.[0-9]*)*\s[0-1]{0,1}(\.[0-9]*)*\s[0-1]{0,1}(\.[0-9]*)*\s[0-1]{0,1}(\.[0-9]*)*
aswell mais il semble que .net ne pas faire face bien avec la syntaxe {0,1} (ou je suis juste en utilisant mal)
J'ai essayé de regarder http://www.regular-expressions.info/reference.html et {0 , 1} devrait être valide à ma compréhension au moins.
j'ai réussi à faire une regex qui correspond à la chaîne dans le petit outil matcher regex je à ma disposition, mais regex ne fonctionnait pas avec le .net classe Regex
MISE À JOUR
I J'utilise la regex conjointement avec un Tokenizer pour analyser un document plus volumineux.
Combineing ce que Pavel Minaev et psasik écrit le regex suivant fait une correspondance attendue
([0,1]|([0,1]?\.[0-9]+))\s([0,1]|([0,1]?\.[0-9]+))\s([0,1]|([0,1]?\.[0-9]+))\s([0,1]|([0,1]?\.[0-9]+))
Ce qui suit correspond au flotteur réelle
([0,1]|([0,1]?\.[0-9]+))
([0,1] | ([0,1]? [0-9] +)) mais cela correspond aussi à des flottants supérieurs à 1 comme 1.23. BTW. vous devriez utiliser (?:) pour grouper au lieu de just() si vous n'avez pas besoin de références arrières. – arsenbonbon
Je n'ai pas vraiment fait grand chose avec regex. Pourriez-vous nous en dire un peu plus à ce sujet? – thmsn
Lorsque vous créez des parenthèses, le moteur regex mémorise la chaîne qui s'y trouve en cas de correspondance pour une utilisation ultérieure, soit dans l'expression elle-même, soit dans la chaîne de remplacement. Ceci est appelé backreferences. Si vous n'en avez pas besoin, vous pouvez l'éviter en utilisant simplement (?:) Au lieu de(). Ce n'est pas un gros problème, mais l'expression est plus rapide alors. Plus d'informations ici: http://www.regular-expressions.info/brackets.html En ce qui concerne la question de la gamme de valeur float jeter un oeil à ma réponse ci-dessous. – arsenbonbon