2012-02-28 7 views
1

だから私はこの問題を抱えています。 POLLに続いて、10個のAs、Ds、またはMs(合意、不一致、多分)の組み合わせがあります。答えが「いいえ」の場合、それに続く理由が必要です。正規表現の場合は

FFキャプチャ:Mは

  • イエス/ノーの答え
  • [いいえ、以下の理由]
  • //大文字小文字を区別しないと答え、

    • A、Dを

      私はこの正規表現に来た

      POLL\s+([ADM]{10})\s+(yes|no\s+([a-z. ]+)) 
      

      文字列は次のとおりです。POLL admaaadddm no no comment

      出力は次のようになります。

      combination --> admaaadddm 
      yes or no --> no no comment //this should be fix, it must capture no only 
      reason --> no comment 
      

      私のコード:

      String message = "POLL admaaadddm no no comment"; 
      
          Pattern pattern = Pattern.compile("POLL\\s+([ADM]{10})\\s+(yes|no\\s+([a-z. ]+))" 
            ,Pattern.CASE_INSENSITIVE); 
      
      
          Matcher m = pattern.matcher(message); 
      
          try 
          { 
           if (m.matches()) 
           { 
      
            String combination = m.group(1); 
            String yesno = m.group(2); 
            String reason = m.group(3); 
      
            System.out.println(combination); 
            System.out.println(yesno); 
            System.out.println(reason); 
      
           } 
          } 
          catch (NullPointerException e) 
          { 
          } 
      
    +1

    コードはどこですか? – Mat

    +0

    正規表現で時間を無駄にしないでください。ポーリングラインを読み込んで解析するだけです。 – DwB

    +0

    私はそうする必要があります。これはregex.LOLを使った割り当てです – tddiaz

    答えて

    0

    代替で一致する部分がキャプチャグループに格納されないように、非キャプチャグループを使用できます。

    (?:...)非捕捉群。

    POLL\s+([ADM]{10})\s+(?:yes|(no)\s+([a-z. ]+)) 
    

    更新

    その後、私はあなたがこのような何かのために行く必要があると思う:

    POLL\s+([ADM]{10})\s+(?:(yes)|(no)\s+([a-z. ]+)) 
    

    は、マウスが上に置いたとき(あなたがグループのコンテンツを見ることができ、それhere on Regexrを参照してください。一致)。

    問題は、現在4つのキャプチャグループがあることです。交替内のグループは異なるグループであるため、これをJavaで回避することはできません。

    group[2]またはgroup[3]が有効かどうかを確認する必要があります。 group[3]の場合は、コメント付きgroup[4]もあります。

    group[1]は、ADMの一部

    group[2]は、 "はい" はそれ以外の場合はNULLがある場合

    group[3]

    group[4]が含まれている "いいえ" "いいえ" がある場合はそれ以外の場合はNULLが含まれていない "はい" が含まれ、常に含まれてい"コメント"そうでなければNULLがある場合

    +0

    POLLに続いて、10個のAs、Ds、またはMsの組み合わせ(同意する、同意しない、多分)をyesまたはnoで指定します。答えが「いいえ」の場合、それに続く理由が必要です。 はFFをキャプチャ: A、D、Mは イエス/ノーの答え ごめん何 – tddiaz

    +0

    を続かないが、私はこれを取得いけない理由を答えます。どのように私はadmの組み合わせグループ、はいまたはいいえグループ、理由グループをキャプチャできますか? – tddiaz

    +0

    あなたは正規表現を試しました。そのほとんど働いている。キャプチャしていない場合はnullを返します。 – tddiaz

    0

    は、この動作しますか?次いで

    Pattern pattern = Pattern.compile("POLL\\s+([adm]{10})\\s+(yes|no)\\s+([a-z. ]+)" 
          ,Pattern.CASE_INSENSITIVE); 
    

    グループ(1,2、)を得ます。

    +0

    @TristanDiazあなたは私の答えで正規表現を試しましたか?それはあなたにグループ1を与える:a..m;グループ2:いいえ。 group3:コメントはありません – Kent

    +0

    有効 POLL AADAMMAADM可 POLL MMMMMMMMMいいえ市長は、停電や交通量を最小限に抑えるために、より良い仕事をする必要があります。 無効(理由なしで答えます、ADMは最大10を加算しません) POLL AAAAADDDMMMMMMAADDいいえ、閉じることはできません。 POLL AAAADDDDMM no – tddiaz

    0

    お試しPOLL\s+([ADM]{10})\s+((yes|no)(\s+([a-z. ]+))?) - (yes|no)の新しいグループを追加します。理由番号のグループは5になりますが、数字は3になります。yesの後の任意のテキストにマッチしますが、無視してください。これは問題ありません。

    EDIT:yes後にドル記号$を挿入することにより

    yes後に何があるかどうかは、試合を防ぐことができます:(@TristanDiazに応答して)POLL\s+([ADM]{10})\s+((yes$|no)(\s+([a-z. ]+))?)

    EDIT 2:

    私はそれに私の人生を賭けていないだろうが、私はあなたが望むものは、少なくとも標準正規表現では可能ではないと恐れています。一方では、あなたはnoとそれの後の説明を常に一緒にしたい。これは、正規表現内の連結を意味します。一方、グループのいずれかにyesまたはnoだけをキャプチャしたい場合は、何らかの形で文字列からnoを分割する必要があります。あなたは同時に両方の方法を持つことはできません。あなたは正規表現の外で何かをしなければならないでしょう(例えば、noをキャプチャし、その後のテキストを1つのグループに入れて正規表現の外にある通常の文字列関数で分割する)、またはyes/noのテキストを取るキャプチャグループを選択します条件によって異なります。いずれにしても、外部コードが必要です。

    正規表現には一定の表現力があり、すべてがその助けによって表現されるわけではありません。たとえば、 "n個のA文字の後にn個のB文字"または "括弧を正しく入れ子にした算術式"のような簡単な式は、正規表現を使用して表現することはできません。

    もし実用的な仕事だったら、正規表現を使わず、最初のN個のスペースに入力文字列を分割し、通常のコードを使って各部分を別々に検証することをお勧めします。

    +0

    この解決策に行ってしまいました。これはうまくいきません。 – tddiaz

    +0

    どうしたらいいですか? – tddiaz

    +0

    これは動作していますが、理由がなくとも一致しません。 – tddiaz

    0

    問題は、3番目のキャプチャグループが2番目のキャプチャグループ内にネストされているため、グループ2とグループ3の一部としてキャプチャされるためです。 正規表現の末尾から括弧を'いいえ'、つまり POLL\s+([adm]{10})\s+(yes|no)\s+([a-z. ]+)

    グループ2が "yes"の場合、グループ3と一致するものは無視します。そこには何かが存在すると仮定します。

    編集

    okが、このPOLL\s+([adm]{10})\s+(yes|no)(?:(?<=no)([a-z. ]+)|$)RegExr

    Aは何の理由もなく一致しないべきではない、と理由でそうがすべきでもないしてみてください。 キャプチャグループも一定です。つまり、グループ2は常にyes/noをキャプチャし、グループ3は常にその理由をキャプチャします。

    +0

    yesnoのグループがキャプチャしていない場合は、理由が続く必要があります。理由がないことは無効です。例。 POST admadmadmmいいえ無効です。POST admadmadmm no blablah。 – tddiaz

    +0

    あなたの正規表現は理由なしで一致します。それはnullを返します – tddiaz

    +0

    @TristanDiazさて、私は私の答えを更新しました。私はこれがうまくいくはずだと思うが、if文を使うのはずっと簡単だろう。 – GenericJon

    0

    条件文をルックアヘッドで正規表現に入れることができます。

    "yes"の後のコメントを含む文字列と一致しないし、コメントなしの "no"も一致しません。グループ1,3,4を「いいえ」に、1 & 2を「はい」にして使用します。

    ** EDIT **

    次の正規表現は動作するはずですし、正しいグループに結果を保存します。 1、2 & 3(「理由」に先行する空白がない場合は、グループ4を使用します)。

    Pattern pattern = Pattern.compile("POLL\\s+([ADM]{10})\\s+(no|yes$)((?:(?<=yes)($)|\\s+(.*)))", Pattern.CASE_INSENSITIVE); 
    
    +0

    あなたの正規表現がうまく動作します!あなたは私にこのことを説明することができますか?いいえ|はい$((?:(?<=はい)($)| \\ s +(。*))) – tddiaz

    +0

    '(no | yes $)'はEOLの単語 "no"または "yes"と一致します。次に条件文 '$?'があります。条件は文字列 "yes"のlookbehindアサーションです。 "yes"が見つかった場合、次に行の終わりに一致させたい場合は '$'を、それ以外の場合は '\\ s +(。*)'でコメントを探します。これが理にかなってほしい。 – dropbear

    関連する問題