2012-11-18 17 views
8

私はthis CodingBat problemを解決しようとしている希望:指定した文字列は、XYZを直接が付け加えされていない「XYZ」の外観が含まれている場合はtrue文字が含まれていない場合、正規表現のみ一致する直前の文字列

戻りますピリオド(。)。だから "xxyz"は数えますが "x.xyz"は数えません。私はこの問題を解決しようとしている真の

→偽
xyzThere( "xyz.abc")→


xyzThere( "abc.xyz")→xyzThere( "ABCXYZ")正規表現は、私はwhere the xyz is not directly preceeded by a period要件を処理する方法が不明です。正規表現で言った制約を処理するための方法を

public boolean xyzThere(String str) { 
    return str.matches(".*xyz.*"); 
} 

任意のアイデア:制約なしの問題のため

私のソリューションは、このですか?

+0

[ネガティブなlookbehind](http://www.regular-expressions.info/lookaround.html#lookbehind)はあなたが探しているものです。しかしそれを使うためには、それについても知っておく必要があります。[limits](http://www.regular-expressions.info/lookaround.html#limitbehind) – Pshemo

答えて

10

Aは文字クラスは、トリックを行う必要があり否定:str.matches(".*(?:^|[^.])xyz.*")

をここで我々は、文字列^の開始時、またはではない任意の位置のいずれかで一致していることを確認するために、非キャプチャグループ(?:^|[^.])を使用しています期間[^.]

5

私は個人的にこのソリューションを使用しますが、他の変異体のかなりの数があります。

str.matches("(.*[^.])?xyz.*") 

私はちょうどに何があるかどうかということを確認してください正面がxyzの場合、期間.は直前にはありません。

あなたはまた、後読みソリューションを書くことができます。

str.matches(".*(?<!\\.)xyz.*"); 

(?<! )部分は否定後読みで、\\.(リテラル期間は)我々はに対してチェックしたいパターンです。

+0

@KelvinMackay:Javaの 'matches'はアンカーとみなされます。 – nhahtdh

+0

私はCodi​​ngBatでテストケースを渡します。コードに失敗したテストケースを提供してください。 – nhahtdh

+0

@KelvinMackay:私が書いた正規表現は、前に '^'があり、 'String'クラスの' matches'の後ろに '$'があるバージョンに相当します。アンカーが仮定されなかった場合、あなたの議論は正しいでしょう。 – nhahtdh

関連する問題