2012-04-26 16 views
2

文字を一致させようとしています。それの前に文字\がないならば。有効なJava Regexの問題

État de l\'impression

無効État de l'impression

有効

Saisir l\'utilisateur et le domaine pour la connexion私は私が後だが、このような負の後読みアサーションなどの一種であると考えていますか?

私はJavaの

コード

String[] inputs = new String[] { "Recherche d'imprimantes en cours…", "Recherche d\\'imprimantes en cours…" } ; 

for(String input : inputs) 
{ 
    Pattern p = Pattern.compile("(?<!\\\\)'"); 
    System.out.println(input); 
    System.out.println(p.matcher(input).matches()); 
} 

出力

Recherche d'imprimantes en cours… 
false 
Recherche d\'imprimantes en cours… 
false 
でこの作品を作るしようとしていたときに問題があるしかし、私は RegexBuilder

でテストしていたときに正常に動作します(?<!\\)'

一致する必要がありますtrue,false

+0

は単に "何これ"「 – delicateLatticeworkFever

+0

@goldilocks前に '[^ \\\\]'権利を使用する方が簡単かもしれませんが、場合には一致しませんan(エスケープされていない!)引用符は、入力文字列の先頭にあります。言い換えれば、 'Pattern.compile(" [^ \\\\] '")。matcher("' ")。find()'はクォートの前にバックスラッシュがないのに 'false'を返します。 –

+0

ああ、良いキャッチ。愚かな私。負のlookbehindは機能しません。 – delicateLatticeworkFever

答えて

3

p.matcher(input).matches()は入力全体を検証します。代わりにp.matcher(input).find()を試してください。

1

正規表現は正常に動作するはずですが、Matcher#matches()は正しく動作するはずです。式の真偽が返されるのは文字列全体に一致します。領域全体をこのパターンとマッチし

試み:Matcher#matches()に対してjavadocから

2

ループ内の同じパターンでPattern.compile()を使用しないでください。コンパイルの目的に反します。

String[] inputs = new String[] { 
    "Recherche d'imprimantes en cours…", 
    "Recherche d\\'imprimantes en cours…" 
}; 
Pattern pat = Pattern.compile("(?<!\\\\)'"); 

for (String s : inputs) { 
    Matcher mat = pat.matcher(s); 
    while (mat.find()) { 
     System.out.format("In \"%s\"\nFound: \"%s\" (%d, %d)\n", 
      s, mat.group(), mat.start(), mat.end()); 
    } 
} 

出力:

In "Recherche d'imprimantes en cours…" 
Found: "'" (11, 12)