validar solo regulares regular reales que punto pattern para numeros mayores expresiones expresion decimales con comas regex parsing scientific-notation

regex - solo - Analizando la notación científica con sensatez



validar numeros con expresiones regulares (2)

Aquí hay un código de Perl que acabo de piratear juntos rápidamente.

my($sign,$coeffl,$coeffr,$exp) = $str =~ /^/s*([-+])?(/d+)(/./d*)?e([-+]?/d+)/s*$/; my $shift = length $coeffl; $shift = 0 if $shift == 1; my $coeff = substr( $coeffl, 0, 1 ); if( $shift || $coeffr ){ $coeff .= ''.''. substr( $coeffl, 1 ); } $coeff .= substr( $coeffr, 1 ) if $coeffr; $coeff = $sign . $coeff if $sign; $exp += $shift; say "coeff: $coeff exponent: $exp";

Quiero poder escribir una función que recibe un número en notación científica como una cadena y divide el coeficiente y el exponente como elementos separados. Podría usar una expresión regular, pero el número entrante puede no estar normalizado y preferiría poder normalizar y luego romper las partes.

Un colega tiene una solución en parte usando VB6 pero no está del todo allí, como muestra la transcripción a continuación.

cliVe> a = 1e6 cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a) coeff: 10 exponent: 5

debería haber sido 1 y 6

cliVe> a = 1.1e6 cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a) coeff: 1.1 exponent: 6

correcto

cliVe> a = 123345.6e-7 cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a) coeff: 1.233456 exponent: -2

correcto

cliVe> a = -123345.6e-7 cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a) coeff: 1.233456 exponent: -2

debería ser -1.233456 y -2

cliVe> a = -123345.6e+7 cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a) coeff: 1.233456 exponent: 12

correcto

¿Algunas ideas? Por cierto, Clive es una CLI basada en VBScript y se puede encontrar en mi weblog .


Google en "regexp de notación científica" muestra una cantidad de coincidencias, incluida esta ( ¡no lo use! ) Que utiliza

*** warning: questionable *** /[-+]?[0-9]*/.?[0-9]+([eE][-+]?[0-9]+)?/

que incluye casos como -.5e7 y + 00000e33 (los cuales es posible que no desee permitir).

En cambio, le recomendaría que use la sintaxis en el sitio web JSON de Doug Crockford que documenta explícitamente qué constituye un número en JSON. Aquí está el diagrama de sintaxis correspondiente tomado de esa página:

texto alternativo http://www.json.org/number.gif

Si json2.js línea 456 de su script json2.js (conversión segura a / desde JSON en javascript), verás esta parte de una expresión regular:

/-?/d+(?:/./d*)?(?:[eE][+/-]?/d+)?/

que, irónicamente, no coincide con su diagrama de sintaxis .... (parece que debería presentar un error) Creo que una expresión regular que implementa ese diagrama de sintaxis es esta:

/-?(?:0|[1-9]/d*)(?:/./d*)?(?:[eE][+/-]?/d+)?/

y si quieres permitir un + inicial también, obtienes:

/[+/-]?(?:0|[1-9]/d*)(?:/./d*)?(?:[eE][+/-]?/d+)?/

Agregue la captura de paréntesis a su gusto.

También le recomiendo que desarrolle un montón de casos de prueba para asegurarse de incluir las posibilidades que desea incluir (o no incluir), como:

allowed: +3 3.2e23 -4.70e+9 -.2E-4 -7.6603 not allowed: +0003 (leading zeros) 37.e88 (dot before the e)

¡Buena suerte!