web-dev-qa-db-ja.com

Javaにワイルドカード文字のようなものはありますか?

私は比較プログラムを実行していて、その瞬間に直接「文字列間」比較を行い、それらが完全に一致する場合は、一致していることを出力します。

さて、私は「類似性」を可能にする追加機能を追加したいと思っていました...

たとえば:

String em1 = "52494646";
String em2 = "52400646";


if (em1.equals(em2)){
    output.writeUTF(dir + filenames[i]);
}

これは一種のコードスニペットです。 「00」をスキップし、「ほぼ」同じ番号として認識し、出力するようにしたいと思います。

String em2 = "524"+ ## +"646"のように見えると思いますが、それは明らかに単なる概念です

この種の「ワイルドカード」(私がuni SQLから選んだ用語)を使用する方法があるかどうか、またはこの類似性タイプの取引を行う別の方法があるかどうかを誰かが知っていますか。

ありがとう:)

7
user585522

正規表現を使用できます。

_if (em1.matches("524[0-9]{2}646")) {
  // do stuff
}
_

Java特定のドキュメントについては、 Patternクラス を参照してください。正規表現の一部の使用法(上記のサンプルなど)については、にショートカットメソッドがあります。 Stringmatches()replaceAll() / replaceFirst() および split()

regular-expressions.info には、一般的な正規表現に関する優れたドキュメントがあります。

16
Joachim Sauer

正規表現を使用して簡単に解決できます。

if (em1.matches("524..646"))

例えば。

.任意の文字 を表すワイルドカードです。ワイルドカードを数字に制限したい場合は、\\dに置き換えることができます。)

これは、任意の文字に対して「0」に一致するより一般的なバリアントです。

String em1 = "52494646";
String em2 = "52400646";

if (em1.matches(em2.replaceAll("0", "\\\\d"))){
    System.out.println("Matches");
}
7
aioobe

前述のREソリューションの問題は、同じ番号で3番目または4番目の位置ではなく、同じで1桁または2桁の番号に関心があることだと思います。

これはもう少し複雑な問題ですが、基本的には2つの文字列の http://en.wikipedia.org/wiki/Hamming_distance を計算する必要があります。多くの問題に対してよく知られているアルゴリズムなので、多くの例を見つける必要がありますが、標準ライブラリではそれができないのではないかと心配しています。また、これはforループとカウンターであるため、実装に問題はありません。STLが使用できる最適化の可能性が失われます(2つの文字列のアドレスを比較し、どちらの場合も文字列全体を比較する必要があります)。しかし、それ以上ではありません。

2
Voo

通常、startsWith、endsWith、containsを組み合わせて、文字列が別の文字列で始まるか、終わるか、含まれているかを調べることができます。これらを組み合わせて使用​​することができます

number.startsWith("524") && number.endsWith("646");

正規表現を使用することは、95%の確率でより適切な選択である可能性がありますが、より高価です。

1
Peter Lawrey

正規表現はあなたがこれをしたい方法でしょう。あなたの例では、"524\\d{2}646"のようなものが必要です。 Java API for Regex を参照してください。

便利なApacheCommons IOライブラリも参照してください。ファイルを扱っているように聞こえます: https://commons.Apache.org/proper/commons-io/javadocs/ api-release/index.html?org/Apache/commons/io/package-summary.html

1
BennyMcBenBen

残念ながら、ApacheCommonsのStringUtilにはワイルドカード操作がないと思います。

私の記憶が正しければ、mysql JDBCコネクタにStringUtilsクラスがあり、文字列をワイルドカードと比較するメソッドがあります。

-または-

いくつかのファズロジックを使用してみることができます: http://jfuzzylogic.sourceforge.net/html/index.html

0
bluefoot

ワイルドカードを表現する別の方法を探している場合は、次のオプションがあります。

    String em1 = "52494646";
    String em2 = "52400646";

    if (em2.startsWith("524")){
      output.writeUTF(dir + filenames[i]);
    }
0
chZek

なぜ人々は単純で直接的なアルゴリズムを書くことに気が進まないのですか?

boolean equals(String s1, String s2, char wildcard)

    if(s1.length() != s2.length()) 
        return false;

    for(int i=0; i<s1.length(); i++)
        char c1 = s1.charAt(i), c2 = s2.charAt(i);
        if(c1!=wildcard && c2!=wildcard && c1!=c2)
            return false;

    return true;
0
irreputable

これには 正規表現 を使用する必要があります。

0
Simeon