2016-03-21 6 views
-1

Java正規表現の "ブランチ"の同じフィールドに何らかの値を設定する方法はありますか?そのため、後でスイッチのようなステートメントを実行すると、例えばブランチセレクタを持つJava正規表現

(\S+|d+|\s+) 

のような3「枝」とPCREに理想的な答えは、共通の変数を持っていることであろう(たとえば、selector)異なる値(たとえば、「非に設定されます-space」、 "数字" と "空間")、

case "non-space": 
case "digit": 
case "space": 

ようswitch文がその後に実行することができます。

ユークリッド・ケースは、Java正規表現を認識しますが、Javaコードの実行を許可しない正規表現エンジンに関連しています。したがって、回答がある場合は完全正規表現ベースである必要があります。

おそらく上記を行うことはできないため、回避策のアドバイスも歓迎します。 :-)

答えて

0

Javaで使用できる正規表現セレクタはありません。

ただし車にはMatcherとグループを使用してください。 Javaでは

Pattern pattern = Pattern.compile("(\\S+)|(\\d+)|(\\s+)"); 
Matcher m = pattern.matcher(input); 
if (m.find()) { 
    if (m.group(1) != null) { // non-space 

    } 
    if (m.group(2) != null) { // digit 

    } 
    if (m.group(3) != null) { // space 

    } 
} 
+0

私は可能ですが、正規表現エンジンはJavaコードを許可しません。したがって、名前付きキャプチャのような、正規表現メカニズムに組み込まれたメカニズムでなければなりません。 – PNS

+0

大丈夫です私が何かを見つけたら私は戻ってくるだろう。 – gustf

+0

Btw、正規表現エンジンの入力と出力のパラメータは何ですか? – gustf

0

、あなたが得ることができる最も近い
異なるコードパスを実行する交代(あなたが示すように)です。正規表現ロジックは、if/then/elseロジックと少し異なります。

(?: 
     (?:    # ---------- 
      (?<a>)   # (1) 
           # do a code 
     | (?<b>)   # (2) 
           # do b code 
     | (?<c>)   # (3) 
           # do c code 
    )     # --------- 

     # Common code 
)+ 

PCREには条件付きと呼ばれるロジックが追加されています。これはswitch文のようなものです。

(?:    # ---------- 
     (?: 
      (?<a>)   # (1) 
     | (?<b>)   # (2) 
     | (?<c>)   # (3) 
    )     # --------- 

     (?(<a>)   # did a match 
           # do a code 
     |     # else 
      (?(<b>)   # did b match 
            # do b code 
      |     # else 
            # do c code 
      ) 
    ) 

     # Common code 
)+ 

しかし、あなたが見ることができるように、本当にこの
文脈で両者の間に違いはありません。

プライマリおよび実際には正規表現の条件文(IMO)
が失敗するか、コード内の特定の点で一致を受け入れるためのフラグとしてである使用。
これは、エンジンに異なる組み合わせを再試行する機会を与えます。 (?(<a>)|(?!))

アサーションの使用がコードにロジック
を注入する長い道のりを行くことに留意してください。これはJavaエンジンで利用可能です。

PCREには、均衡のとれたテキストマッチを行う必要がある場合には、
と再帰的に呼び出すこともできる関数呼び出し構文もあります。ただし、これはJavaで利用可能な
ではありません。

+0

回答は不完全なようですが、 ( "a"、 "b"、 "c")を生成するため、このアプローチは使用できません。同じ変数名を持つ方法についての質問です")、ブランチごとに異なる値を生成する(セレクタ=" a "、セレクタ=" b "、セレクタ=" c ") – PNS

+0

@PNS - 質問の投稿に記載した内容を繰り返す必要はありませんあなたは正規表現、すなわち 'switch'ステートメントでC言語ロジックを探しています。これは明らかに存在しません。また、min、max loo ps。正規表現で共通の言語構造に存在しないロジックを実行する方法はたくさんあります。私はあなたがすでにそれを知っていると思った。正規表現はかなり豊富で共通言語の簡単な構文ではできないことを行うことができます。この誤った比較で正規表現をどうにかしてノッキングしようとするのであれば、エキスパートとは動作しません。 – sln

+0

私は非常に明確な質問をしました。おそらく答えがないことを知っています。否定性、陰謀理論(ノック正規表現?)や講義の必要がないので、何も問題はありません。あなたは名前のついたグループを説明することで答えを出しました。これは質問に関するものではなく、あなたの答えは半分のフレーズで終わるという意味では不完全です(例えば "...")。それで全部です。御時間ありがとうございます。 – PNS