嗨,我有一个字符串列表..
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);
}
这段代码仅返回'测试'但不是"测试测试" ..
如果元素有空格,则此代码无法正常工作
答案 0 :(得分:2)
那是因为您将*替换为\ w *,这意味着找到"字符"直到你可以,正如所描述的那样here尝试替换它应该做的技巧.*
你也可以摆脱那些丑陋的逃脱:)也可以使用java8流api让它看起来更漂亮像这样:
List<String> list = values.stream().filter( s -> s.matches(queryStr)).collect(Collectors.toList());
答案 1 :(得分:1)
以下代码有效:
String queryStr = "Te.*";
for (String str : list) {
if (str.matches(queryStr))
values.add(str);
}
System.out.println(values);
第一个问题是matches()
匹配完整字符串,因此您必须更新regexp。 \w
将匹配单词,如果有空格,则匹配另一个单词。这与matches()
结合使得它永远不会起作用。我修改了正则表达式,因此它会匹配以Te
开头的所有字符串,因为.*
将匹配其他所有字符串。
还有另一个错误,您尝试迭代str
列表,然后将找到的元素添加到同一列表中。 Java会抛出ConcurrentModificationException
。
答案 2 :(得分:0)
你有一些问题
matches
仅对全字符串匹配返回true,而不是子字符串匹配\w
仅匹配单词字符而非空格。contains
找到文字子字符串匹配,而不是正则表达式。您的解决方案是:
.replaceAll("\\*", ".*")
Pattern.find
代替String.match
答案 3 :(得分:0)
尝试使用Pattern.quote。
yourString.replaceAll(Pattern.quote("Te"),"");
这里正在取代所有的&#34; Te&#34; by&#34;&#34;;
答案 4 :(得分:0)
我绝不是一名正则表达式专家。但是根本没有替换*,最后添加。*为我做了
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);
}