0

这就是我想要做的。用户可以输入搜索字符串,其中可以包括“*”或“?” 通配符。我发现这适用于常规字符串,但不适用于包含数字字符的字符串。

例如:414D512052524D2E535441524B2E4E45298B8751202AE908 1208

如果我查找该十六进制字符串的一部分,它会返回 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*),以某事()结尾*something,或者完全是某事(something)。
于 2013-05-09T17:27:15.503 回答