[英]Wild card search in Java strings
嗨,我有一个字符串列表。
List list = new ArrayList();
list.add("Test");
list.add("Test Test");
list.add("Test Second");
我想搜索“ Te *”之类的字符串。
我使用以下代码进行搜索
queryString = "Te*";
queryString = queryString.replaceAll("\\*", "\\\\w*");
for (String str : values) {
if (str.matches(queryStr) || str.contains(queryStr))
list.add(str);
}
这段代码仅返回“测试” ..而不返回“测试”。
如果元素有空格,则此代码不起作用
那是因为您要将*替换为\\ w *,这意味着找到“单词字符”,直到可以为止为止,如此处所述,尝试替换它.*
应该可以解决问题,并且您也可以摆脱那些难看的转义符:)可以使用java8流api使其看起来更好,如下所示:
List<String> list = values.stream().filter( s -> s.matches(queryStr)).collect(Collectors.toList());
以下代码有效:
String queryStr = "Te.*";
for (String str : list) {
if (str.matches(queryStr))
values.add(str);
}
System.out.println(values);
第一个问题是matches()
匹配完整的字符串,因此您必须更新regexp。 \\w
将匹配单词,如果有空格,则匹配另一个单词。 这与matchs matches()
结合使用matches()
导致它永远无法工作。 我修改了regexp,使其匹配以Te
开头的所有字符串,因为.*
会匹配其他所有字符串。
还有另一个错误,您试图遍历str
列表,然后将找到的元素添加到同一列表中。 Java会抛出ConcurrentModificationException
。
你有几个问题
matches
仅对全字符串匹配返回true,而不对子字符串匹配返回true \\w
仅匹配单词字符,不匹配空格。 contains
查找文字子字符串匹配项,而不是正则表达式。 您的解决方案是:
.replaceAll("\\\\*", ".*")
Pattern.find
代替String.match
尝试使用Pattern.quote。
yourString.replaceAll(Pattern.quote("Te"),"");
这里是用“”替换所有“ Te”;
我绝不是正则表达式专家。 但是根本不替换*,最后添加。*对我有用
List<String> list = new ArrayList<String>();
list.add("Test");
list.add("Test Test");
list.add("Test Second");
String queryString = "Te*s";
// queryString = queryString.replaceAll("\\*", "\\.\\*");
queryString = queryString.concat(".*");
for (String str : list) {
if (str.matches(queryString))
System.out.println(str);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.