0

これが私がやろうとしていることです。ユーザーは、「*」または「?」を含む検索文字列を入力できます。ワイルドカード文字。これは通常の文字列では機能しますが、数字を含む文字列では機能しません。

例: 414D512052524D2E535441524B2E4E45298B8751202AE908 1208

その 16 進文字列のセクションを探すと、false が返されます。「1208」文字列で「120」または「208」を探すと失敗します。

現在、ユーザーが「w?f」と入力すると、私の正規表現パターンは次のようになります: '\bw.?f\b'

私は現時点で(明らかに)正規表現に精通していませんが、誰かが私が必要とする方法で数字を処理する必要があるかもしれないポインタをいただければ幸いです - ありがとう!

問題のコード:

 /**
 *
 * @param searchString
 * @param strToBeSearched
 * @return
 */
public boolean findString(String searchString, String strToBeSearched) {
    Pattern pattern = Pattern.compile(wildcardToRegex(searchString));
    return pattern.matcher(strToBeSearched).find();
}

private String wildcardToRegex(String wildcard){
    StringBuffer s = new StringBuffer(wildcard.length());
    s.append("\\b");
    for (int i = 0, is = wildcard.length(); i < is; i++) {
        char c = wildcard.charAt(i);
        switch(c) {
        case '*':
            s.append(".*");
            break;
        case '?':
            s.append(".?");
            break;
        default:
            s.append(c);
            break;
        }
    }
    s.append("\\b");
    return(s.toString());
}
4

1 に答える 1

0

検索する文字列が

1208

ユーザーが入力する検索「用語」は

120

その時のパターンは

\b120\b

(\b単語境界) メタ文字は、「単語」の先頭末尾に一致します。
この例では、120!=のため、これは機能しません。1208

パターンは

\b.*120.*\b

ここで.*を意味しmatch a variable number of characters (including null)ます。

解決:

  • .*メソッドにs を追加してwildcardToRegex(...)、この機能をすぐに使えるようにするか、
  • または、ユーザーに を検索するように指示します。*120*これは、*ワイルドカード文字がまったく同じことを行うためです。ユーザーは、何かで始まるエントリを検索するか ( を検索)、何かを含むか ( )、何かで終わるエントリ ( )、または正確に何か
    を検索するか ( ) を定義できるため、実際にはこれが私の好みです。something**something**somethingsomething
于 2013-05-09T17:27:15.503 に答える