Ruby Regex para capturar cualquier carácter numérico en una cadena

Por lo tanto, he investigado mucho y he mirado toneladas de documentación de expresiones regulares, guías y generadores de expresiones regulares, pero nada de lo que he encontrado puede decirme cómo hacerlo (ni siquiera los enlaces en el cuadro emergente de StackOverflow que aparecieron cuando Escribí “expresiones regulares” en el campo “Título” para esta pregunta).

Básicamente, estoy escribiendo un progtwig de matemáticas (en Ruby) para resolver un tipo muy específico de problema matemático. Habrá dos entradas que toman cadenas (a través de gets.chomp), y una cadena tomará la forma de

2x^3+4x^2+5x-42 

Ahora, los exponentes (^ 3 y ^ 2) se mantendrán iguales, y estos pueden ser ignorados por la expresión regular, al igual que cualquier signo de sum y resta, y cualquier carácter de “x”.

Entonces, en esencia, necesito averiguar cómo escribir una expresión regular que pueda ordenar cualquier carácter numérico en una cadena a menos que estén precedidos por un “^” (que denota un exponente), y empujarlos hacia fuera en una matriz. (Las cadenas de números en las matrices se analizarán en valores numéricos más adelante)

Así, por ejemplo, la expresión regular ideal tomaría algo como

 8x^3-4x^2+3x-17 

y devuelve una matriz que contiene los coeficientes de la ecuación

 ["8", "-4", "3", "-17"] 

Es importante mantener los signos negativos / sustracción donde están presentes. Otro ejemplo:

Tomaría

 -6x^3+7x^2-5x+9 

y volver

 ["-6", "7", "-5", "9"] 

¿Alguna idea de cómo podría hacer esto? ¿Sería quizás más fácil aplicar dos expresiones regulares? Ruby responde solo, por favor.

Si toma cada ecuación como una cadena, esta expresión regular solo seleccionará los coeficientes.

Regex: -?\d+(?=x|$)

Demostración Regex101


Solución alternativa

Puede dividirse en la siguiente expresión regular para extraer solo los coeficientes.

Regex: x(?:\^\d+)?\+?

Demostración Regex101


También marque esta respuesta para analizar una expresión matemática de cadena.

Supongo que la variable es una letra minúscula y no hay espacios (aunque los espacios se pueden eliminar fácilmente en un paso de preprocesamiento).

Suponer:

 str = "2x^3-x^2+3x-42" 

Nos gustaría extraer estos coeficientes:

 [2, -1, 3, -42] 

Esto se complica por el hecho de que “-1” es implícito. En lugar de intentar resolver esta complicación en una expresión regular, es más fácil convertir primero los “1” implícitos en “1” explícitos. Podemos hacer eso de la siguiente manera:

 r0 = / (?<=\A|\+|\-) # match beginning of string, "+" or "-" in a positive lookbehind [az] # match a lowercase letter in a positive lookahead /x # Free-spacing regex definition mode 

Por ejemplo:

 "x^3-x^2+x-42".gsub(r0) { |s| "1" + s } #=> "1x^3-1x^2+1x-42" 

Ahora estamos listos para extraer los coeficientes.

 r1 = / (?:\A|[^^-]) # match beginning of the string or any character other than # carat or hyphen in a non-capture group \K # forget everything match so far \-? # optionally match a hyphen \d+ # match >= 0 digits /x "2x^3-4x^2+5x-42".scan(r1) #=> ["2", "-4", "5", "-42"] 

Ahora combina los dos pasos:

 "2y^3-y^2+y-42".gsub(r0) { |s| "1" + s }.scan(r1) #=> ["2", "-1", "1", "-42"]