2016-06-17 44 views
0

私は本当に単語を見つける正規表現を作成するのに苦労していますが、それが入っている行が始まっていない場合にのみ - 。例えば正規表現を見つける正規表現

:単語の

ルック:

-- check if //should not match 
-- more random words if //should not match 
check if //should match 

場合、私は次のように負のlookbehindsを使用して試してみました:

(?<!-- .*)\bif\b 

しかし、私はJAVAを使用していますし、また、私が使用することはできませんlookbehindsの量子。私は

(?<! --)\bif\b 

をしようとした場合

は、それは私がSKIPとFの使用を見つけた

-- if \\works 
-- if \\does not work 

の作業を行いますが、JAVA、これらの2つに応えるいないようです。

私はこれにどのように対処できますか?

ありがとうございます!

+2

'!line.startsWith(" - ")&& line.matches(" \\ bif \\ b ")'の何が問題なのですか?あなたは正規表現ですべてをやらなければならないと主張することによって、すべてをより複雑にする良い理由はありますか? – ajb

+0

こんにちは@ajb、私は一致する複数の単語を持つ複数行のテキストを持っています。私はすでに私が一致する必要があるすべての単語をループするループを持っています。私はtext.replaceallを使用しているので、\ nでテキスト全体を分割して各行を繰り返し処理する必要はなく、一致する必要のある各キーワードを繰り返し処理します。 –

+0

@Takeshi ajbのコメントはAFAIKのスポットです。あなたが必要とする正規表現は複雑になるでしょうが、Javaの文字列操作を使用するのは簡単で維持しやすいでしょう。 –

答えて

0

は、Java 8を使用していると仮定すると、あなたはこのような何かを行うことができます:

Pattern p = Pattern.compile("^(?!--).*if"); 
    Predicate<String> pred = s -> {return p.matcher(s).find();}; 
    Files.lines(Paths.get("files/input.txt")) 
     .filter(pred).forEach(System.out::println); 

それはnegative look aheadと呼ばれています。私はそれが助けて欲しい

0

私はあなたの行があるどのくらい知っていませんが、例えば、この醜い建設を使用することができます(もちろん、数は少ないかもしれない):

(?m)(?<!^--.{0,99999999999999999})if 

EXAMPLE

Javaは、いくつかの間隔の数量を可能に後ろに見て先を見て、しかしそれはちょうど間違って見える:Pしかし、それは少なくともこの例で私のために動作します。

他のアプローチでは、すべての出現を見つけたい場合、キャプチャグループを使用しないのはなぜですか?以下のような:

String[] examples = {"-- check if ", 
     "-- more random words if ", 
     "check if ", "-- f", 
     "-- check if \n-- more random words if \ncheck if "}; 
for(String string : examples) { 
    System.out.println(string.replaceAll("(?m)(?!^--)^(.*?)if","$1" + "replacement")); 
    System.out.println(); 
} 

正規表現(?m)(?!^--)^(.*)(if)は、単語を検索するために、すべてを一致し、グループ1にそれをキャプチャし、raplacementに、あなたはテキストに戻ってそれを置くことができます。最も効率的ではありませんが、とにかくうまくいくはずです。

+0

このようなコードは私を緊張させます。 –