2016-04-08 24 views
0

私は多項式であることを望む文字列を持っています。"2x^2-3x+1のようなものです。正規表現を使用して、式の各項をグループ化したいと考えています。私は現在"^(-?\d?x(\^\d)?)+"を持っています。私はオプションのマイナス記号、次に数字、次にx、そしてオプションの指数部をキャプチャしようとしています。これは "^ someNumber"の形式でなければなりません。だから私の上の多項式の場合、私はグループ1を"2x^2"、グループ2を"-3x"、グループ3を"+1"としたいと思うだろう。まず、(someGroupExpression)+があれば、someGroupExpressionごとにグループが生成されますか?第2に、指数部については、ネストされたグループにすることは望ましくありません。これは、用語グループをループするのが面倒になるためです。指数部がグループ化せずに従うべきルールを指定するにはどうすればよいですか?質問を明確にすることができるかどうか教えてください。多項式の正規表現

+0

非キャプチャグループを使用しますか? –

+0

ノンキャプチャグループ!それはちょうど私の質問の2番目の部分を探していたものです。ありがとう、私はグーグルで試してみましたが、私は悪い言い訳をしたと思います。 – nilcit

+0

[この回答](http://stackoverflow.com/questions/36438736/ruby-regex-to-capture-any-numerical-characters-in-a-string/36438777#36438777)をご覧になることをお勧めします。 。 –

答えて

0

ネストされていない、または重複していないグループ内の各サブ式を取得するには、次の正規表現を使用します。

正規表現:([+-]?[^-+]+)

説明:それは各試合を重複することなく全体の各部分式をキャプチャします。

Javaコード

String exp = "2x^3+4x^2+5x-42"; 
Pattern pattern = Pattern.compile("([+-]?[^-+]+)"); 
Matcher matcher = pattern.matcher(exp); 
int x=0; 
while (matcher.find()) { 
    x=x+1; 
    System.out.println("Group "+x+": " + matcher.group(1)); 
} 

Regex101 demo

Ideone Demo


すべてのサブ表現を考慮し、より堅牢な正規表現は次のようになります。

正規表現:ダブルエスケープのためのJavaで([+-]?(?:(?:\d+x\^\d+)|(?:\d+x)|(?:\d+)|(?:x)))

使用\\\d\\d\^\\^になります。

Regex101 Demo

Ideone Demo

+0

@nilcit:それでは変更します。私は '+'や '--'のような式の中で記号を区切ることだけをチェックしています。緑色のチェックマークは、**回答を受け入れるためのものです。したがって、これが**解決策**であると確信している場合にのみ受け入れてください。それが役に立ったらUpvoteだが、答えを受け入れる前に考える。 –

+0

私は自分自身で解決策を理解しようとしましたが、次のようになりました: '([+ - ]?[^ - \^+ \\] + x(?:\^[x - \\]))?) ' - 私は電卓型のアプリケーションのためにこれを意図しているので、ユーザーが入力できる唯一の記号は10進数、プラス、マイナス、除算、乗算記号、' x'記号です。ご助力ありがとうございます! – nilcit

+0

@nilcit:あなたが思いついた正規表現は係数のない最後の数字を残しています。もう一度それをチェックしてください。 –