2012-01-10 7 views
4

Javaで次のCobolコードを解析しようとしています。Java正規表現で単語を否定しようとすると問題が発生する

 
    PNAME.                 P000 
    084500  MOVE  src1 TO dest1         P110 
    084510  MOVE  src2 TO dest2         P111 
    084520  MOVE  src3 TO dest3         P115 
    084530  MOVE  src4 TO dest4         P120 
    084540  MOVE  src5 TO dest5.         P140 
    084550  PERFORM  TOTO THRU TOTO-FN.        P310 

私の目標は、指定された名前に対応するMOVEステートメントを見つけることです。
例:dest5と一緒に「MOVE src5 to dest5」を検索したい

私のJavaコードです:

 
    MOVE  src1 TO dest1         P110 
    084510  MOVE  src2 TO dest2         P111 
    084520  MOVE  src3 TO dest3         P115 
    084530  MOVE  src4 TO dest4         P120 
    084540  MOVE  src5 TO dest5. 

をしかし、私はこれだけの行を取得したい:

 
    String paragraphePart = "PNAME.                 P000 
084500  MOVE  src1 TO dest1         P110 
084510  MOVE  src2 TO dest2         P111 
084520  MOVE  src3 TO dest3         P115 
084530  MOVE  src4 TO dest4         P120 
084540  MOVE  src5 TO dest5.         P140 
084550  PERFORM  TOTO THRU TOTO-FN.        P310"; 
    Matcher m = Pattern.compile("MOVE((?!.*MOVE.*).)*TO\\s+[^\\.]*"+"dest5"+"(\\s+|\\.|$)",Pattern.MULTILINE).matcher(paragraphePart); 
    while(m.find()){ 
    //treatement on m.group(0) 
    } 

m.group(0)含まれています "dest5 TO MOVEのsrc5を"私はMOVEのようなものを使用してきた私の正規表現で * TO私はこの場合持つことができるので:ここ

 
    084540  MOVE      P120 
    084550  src5 TO dest5. 

を私は をdest5だけdest5 TO src5ないようにP120 084550 src5を移動取得する必要があります。

どうすれば私の正規表現にMOVEの後に何かがあると言えるでしょうか?別の "MOVE"ではなく、 "TO"が続いていますか?

おかげ

[SOLVED]
私が使用します。

 
    Matcher m = Pattern.compile("(MOVE(?!.*?MOVE).*?\\s+TO\\s+[^\\.]*"+fieldName+"(\\s+|\\.|$))", Pattern.DOTALL).matcher(paragraphePart); 

はあなたanubhavaをありがとう!私はMOVEのsrc5がdest5ために得ることができます
Matcher m = Pattern.compile("(MOVE(?!.*?MOVE).*?\\s+TO\\s+[^\\.]*"+"dest5"+"(\\s+|\\.|$))", Pattern.DOTALL).matcher(paragraphePart);
を使用して
https://stackoverflow.com/a/8803309/1140748

[NEW PB] 。しかし、私が "dest4"を使ってこの行を "src4 to dest4"にしようとすると、もう動作しません。アイデアはありますか?

Matcher m = Pattern.compile("(MOVE(?!.*?MOVE.*?"+fieldName+").*?\\s+\\w+\\s+TO\\s+[^\\.]*"+fieldName+"(\\s+|\\.|$))", Pattern.DOTALL).matcher(paragraphePart); 


+0

http://koopa.sourceforge.net/さらなる研究のための –

+0

TY良いリンク;)速い答えのため –

答えて

1
あなたは否定先読みベースの正規表現次使用することができ

String needle = "dest5"; 
Matcher m = Pattern.compile("(MOVE(?!.*?MOVE.*?" + needle + ").*?\\s+.+?\\s+TO\\s+" + needle + ")", Pattern.DOTALL).matcher(paragraphePart); 
+0

真の答えを与える最後の例のため私は 私たちは "src5 to dest5"を得るので、私は2行を持っているので、私は "MOVE P120 084550 src5 TO dest5"を取得する必要があるので もう一つの問題は、正規表現のMOVE文には、 "src5"の文章をすべて –

+0

に入れないようにしています。私の更新された答えを確認してください。両方の例とも動作します。 – anubhava

+0

ありがとう '(?!。*?MOVE)。*?'それはいいです:) 私はいくつかの研究をしましたが、どのように動作するのか分かりません... 'の意味は? '〜'。* ' –

0

単語全体を否定する簡単な方法はありません、あなただけの文字で手紙を否定することができます。

これを行う最も簡単な方法は、正規表現ではなく通常のJavaコードを使用することです。

+0

ありがとう!私は、http:// stackoverflowのようにこれについて話すスレッドが見つかった可能性があると思います。com/questions/1240275/how-to-negate-specific-word-in-regex 本当に正規表現を使用する必要があります。これは、完全なcobolプログラムの指定フィールドに関連するすべてのMOVE文を見つける最も簡単な方法です。 –

関連する問題