Die Regex ich gerade arbeite im Moment ist wie folgt:Regex „Beginn der Zeichenfolge“ Anker nicht funktioniert
^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
Ich versuche, alle Gleitkommazahlen zu entsprechen, aber nur die Nummer. Zum Beispiel sollte die folgenden entsprechen:
- 6,0
- 1.22E3
- -2
- 2.99999e-12
Allerdings sollte die folgenden nicht überein:
- somestring /////// 6,0
Ich habe die obige Regex auf this validation site getestet und es funktioniert wie erwartet. Wenn es in meinem Bash-Skript ausgeführt wird, stimmt jedoch nichts.
Dies ist mein bash Code:
if [[ "$VAL" =~ ^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$ ]]
then
echo $VAL, "is a number"
else
echo $VAL, "is not a number"
fi
Ich habe versucht, die Anker zu entfernen, und sie paßt alle Strings, die Floating-Punkte enthalten. Strings wie "//////6.00007" stimmen jedoch überein. Der $ -Anker funktioniert wie erwartet; Das tut es jedoch nicht.
Bitte lassen Sie mich wissen, wenn Sie Vorschläge zur Fehlerbehebung haben.
Danke!
bearbeiten 1
Entfernt schlechte Beispiele
bearbeiten 2
lief ich die Regex in seinem eigenen foo.sh
wie @lurker vorgeschlagen und der Code lief wie bei meinem Testfälle erwartet . Also schaute ich mir an, was mit der Regex verglichen wurde. Als ich sah, was verglichen wurde, sah alles gut aus, also machte es keinen Sinn, warum die Regex nicht übereinstimmte.
Dann begann ich zu vermuten, dass echo
wurde nicht angezeigt, was war eigentlich in $VAL
aus irgendeinem Grund.
So lief ich das: NEWVAL=(echo $VAL)
als temporäre Abhilfe, bis ich herausfinden kann, was los ist.
Ich habe versucht, Ihre Regex und Skript wie es ist, und sie scheinen für mich gut zu funktionieren. '" //////6.00007 "kam heraus" ist keine Zahl ". – lurker
Seltsam. Was sind die Möglichkeiten? Warum würdest du das Skript laufen lassen und nicht ich? – kgrimes2
Wie haben Sie Ihr Skript ausgeführt? Zeigen Sie genau, was Sie getan haben. Ich habe Ihren Code in eine Datei 'foo.sh' geschrieben, dann 'export VAL =" 6 "' und rannte 'bash foo.sh' und es hieß,' 6, ist eine Zahl'. Ich habe dann 'VAL =" ////// 6.000007 "' exportiert und rannte 'bash foo.sh' und sagte,' ///////6.000007, ist keine Zahl'. Sie können 'bash --version 'ausführen und angeben, welche Version von' bash 'Sie verwenden. – lurker