0

String[]特定の文字で構成される単語のみを含むを作成しようとしています。たとえば、次のような多くの単語を含む辞書があります。

腕 アーミー アート アズ アット アタック アテンプト 注意 アトラクション オーソリティ 自動 目覚め 赤ちゃん 背中 悪い バッグ バランス

リストを絞り込み、abg. したがって、この例では、リストには「バッグ」という単語のみを含める必要があります。現在、正規表現を使用してこれを実行しようとしていますが、動作させることができないように見える前に使用したことがありません。これが私のコードです:

public class LetterJugglingMain {
public static void main(String[] args) {
    String dictFile = "/Users/simonrhillary/Desktop/Dictionary(3).txt";
    fileReader fr = new fileReader();
    fr.openFile(dictFile);
    String[] dictionary = fr.fileToArray();
    String regx = "able";
    String[] newDict = createListOfValidWords(dictionary, regx);
    printArray(newDict);
}

public static String[] createListOfValidWords(String[] d, String regex){
    List<String> narrowed = new ArrayList<String>();
    for(int i = 0; i<d.length; i++){
        if(d[i].matches(regex)){
            narrowed.add(d[i]);
            System.out.println("added " + d[i]);
        }
    }
    String[] narrowArray = narrowed.toArray(new String[0]);
    return narrowArray;
}

ただし、文字列正規表現が正確な単語でない限り、返される配列は常に空です! 何か案は?必要に応じてさらにコードを投稿できます...正規表現を間違って初期化しようとしているに違いないと思います。絞り込まれたリストには、正規表現の文字のみを含める必要があります。

4

4 に答える 4

2

正規表現ableは文字列のみに一致します"able"aただし、正規表現を、、、またはのいずれかの文字に一致させる場合はb、探している正規表現は(括弧内)です。そのような文字を複数含む単語が必要な場合は、パターンを繰り返すためのを追加します。le[able]+[able]+

于 2013-01-06T17:58:10.287 に答える
2

率直に言って、私は正規表現の専門家ではありませんが、あなたが望むことを行うための最良のツールだとは思いません. 次のような方法を使用します。

public boolean containsAll(String s, Set<Character> chars) {
    Set<Character> copy = new HashSet<Character>();
    for (int i = 0; i < s.length() && copy.size() < chars.size(); i++) {
        char c = s.charAt(i);
        if (chars.contains(c)) {
            copy.add(c);
        }
    }
    return copy.size() == chars.size();
}
于 2013-01-06T18:13:28.277 に答える
1

OPは、すべての文字を含む単語を必要としています。それらの1つだけではありません。そして、他のキャラクターは問題ではありません。

この場合、最も簡単な方法は、文字列全体を1文字ずつループして、必要なすべての文字が含まれているかどうかを確認することだと思います。すべての文字が見つかったかどうかを確認するためにフラグを保持します。

そうでない場合....:

正規表現を使用してみてください:

^[able]+$

これが何をするかです:

^文字列の先頭に一致し、文字列$の末尾に一致します。これにより、部分的に一致しないようになります。

[able]文字列を構成する文字(この場合は、、、、および)にa一致blますe+文字列にこれらの文字が1つ以上含まれていることを確認してください。

注:この正規表現は、これらの4文字を含む文字列と一致します。たとえば、次のように一致します。

できる、アルベ、aeble、a​​aaabbblllleeee

一致しません

qable、処理可能、およびabled。

于 2013-01-06T17:58:11.973 に答える
0

セット内のすべての文字が少なくとも 1 回出現する単語を除外する正規表現の例。これは、a、b、g のすべての文字が少なくとも 1 回出現する英単語 (大文字と小文字を区別しない) に一致します。

(?i)(?=.*a)(?=.*b)(?=.*g)[a-z]+

一致する文字列の例はbag、、、baggyですgrab

一致しない文字列の例はbig、、、argumentですnothing

この(?i)手段は、大文字と小文字を区別しないフラグをオンにします。

(?=.*<character>)文字ごとに、セット内の文字数と同じ数を追加する必要があります。

単語には英語のアルファベットのみが含まれていると想定しているため、 を指定します[a-z]。スペースやハイフンなどが必要な場合は、さらに指定してください。

クラス内のmatches(String regex)メソッドを想定しているので、とは省略しました。String^$

最悪の場合 (文字が単語の末尾にある)、正規表現エンジンが文字列を n 回 (n はセット内の文字数) 処理する可能性があるため、パフォーマンスが低下する可能性があります。単語が非常に短いため、実際にはまったく問題にならないかもしれませんが、これがボトルネックであることが判明した場合は、単純なループを実行することを検討してください。

于 2013-01-06T18:08:35.460 に答える