2016-04-05 26 views
0

私はたくさんの研究を行い、数多くの正規表現のドキュメント、ガイド、正規表現ジェネレータを見てきましたが、私が見つけたものは何も教えてくれない(この質問の "Title"フィールドに "regex"と入力したときに現れるStackOverflowポップアップボックスのリンクさえもそうではありません)。Ruby Regex文字列内の数字の文字をキャプチャする

私は基本的に、非常に特殊なタイプの数学問題を解決するための数学プログラム(Ruby)を作成しています。そこ(gets.chomp経由)の文字列を取る二つの入力になり、1つの文字列が今

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

の形をとるだろう、指数(^ 3 ^と2)は同じままになり、これらのことが可能任意の加減算記号や任意の "x"文字と同様に、正規表現によって無視されます。

本質的に、「^」(指数を表す)が前に付いていない限り、文字列内の任意の数字を並べ替える正規表現を書く方法を理解する必要があります。アレイ。 (アレイ内の数字の文字列が後数値に解析されるであろう)

したがって、例えば、理想的な正規表現が

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

ようなものを取り、式から係数を含む配列を返します

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

負の/減算記号が存在する場所に保持することが重要です。別の例:

それは

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

を取ると、私はこれをやって行くかもしれない方法

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

任意のアイデアを返すでしょうか? 2つの別々の正規表現を適用するほうが簡単でしょうか? Rubyは答えだけです。

+0

を主な問題は、COEFは、1(または0)である場合であり、書き込まれていません。 –

答えて

2

各式を文字列として取った場合、この正規表現は係数のみを選択します。

正規表現:-?\d+(?=x|$)

Regex101 Demo


代替ソリューション

あなたは係数のみを抽出するために正規表現を次のように分割することができます。

正規表現:x(?:\^\d+)?\+?

Regex101 Demo


また、数学的な文字列式を解析このanswerを確認してください。

+2

これは 'str =" 2x^3-x^2 + x-42 "'では機能しません。 'str.split(/ x(?:\^\ d +)?\ +?/)#=> => [" 2 "、" - "、" "、" -42 "]'もちろん、 " - "を "-1"に、 ""を "1"に変換する後処理ステップを実行します。 –

+0

@CarySwoveland:それは真実です。より良い解決策が歓迎されます。 –

1

変数は小文字で、スペースはありません(ただし、前処理ステップでスペースを簡単に削除できます)。仮定

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

私たちは、これらの係数を抽出したい:これは "-1" 暗黙的であるという事実によって複雑になる

[2, -1, 3, -42] 

。 1つの正規表現でこの複雑さに対処しようとするのではなく、まず暗黙の "1"を明示的な "1"に変換する方が簡単です。例えば

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

を::

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

我々は今の係数を抽出する準備ができている私たちは、次のようにそれを行うことができます。

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"] 

次に二段階組み合わせる:

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