2017-05-07 1 views
1

私は、このプログラムをここで文中の接続詞を検索することにしました。 私は配列作っ:たとえば正規表現マッチャーは、文字列の繰り返し検索を防ぎます。

String toSearch = "(?i)\\b(" + String.join("|", SUB_CONJS) + ")\\b"; 
Pattern pattern = Pattern.compile(toSearch); 
Matcher matcher = pattern.matcher(text); 
int count = 0; 
while (matcher.find()) count++; 

、I場合:あなたが、私は彼らのために検索するマッチャーを使用し、そのような"if""as if"

としてrepititionsがある見ることができるように

public static final String[] SUB_CONJS = new String[] { 
    "after", "afterwards", "although", "as if", 
    "as long as", "as much as", "as soon as", 
    "as though", "because", "before", "by the time", 
    "even if", "even though", "if", "in order that"... 
    //some more  
}; 

text"as if"を入れると、"if""as if"の両方を検索したため、countは2となります。問題を解決する方法はありますか?感謝

+1

コンパイルされません。静的な 'Pattern.matcher()'メソッドはありません。コードを再入力しないでください。常にStackOverflowエディタにコピー/ペーストしてください。 –

+3

これは正規表現で '' if before '''と同じように '' if' 'が' 'if ''をそのようなテキストとマッチさせないようにしているので、おそらくあなたはSUB_CONJS配列部分を持っています。 'contains'メソッドを使ってこの配列をソートしようとすることができます。文字列Aに文字列Bが含まれている場合、Aは配列のBの前に置く必要があります。 – Pshemo

答えて

1

Pshemoが書いたように、コード例は、文字列"as if":1が一致するかどうかをテストするときに望ましい結果を返します。

"if""as if"の接頭辞ではないためです。実際には、Pshermo以外の言い方をすれば、"if""as if"があなたの正規表現にどのような順序で現れるかは関係ありません。なぜならそれらはお互いの接頭辞ではないからです。

"as"を「as」で始まる他の用語の前にリストに追加すると、問題はより複雑になります。この場合、正規表現は実際には "as"を "消費"し、より長いマッチを無視します。

これは、簡単に検索する前に、それに応じて検索用語をソートすることにより固定されている:文字列の順序でわずかため、

Comparator<String> prefixesLast = (s1, s2) -> { 
    if (s1.startsWith(s2)) return -1; 
    if (s2.startsWith(s1)) return 1; 
    return s1.compareTo(s2); 
}; 

か、それがさらに簡単にするが、降順:

使用
Comparator<String> descending = (s1, s2) -> return s2.compareTo(s1); 

をあなたの正規表現を生成するソートされたリストは常に最も長いマッチを見つけることを保証する必要があります。