有没有办法检查子字符串是否包含整个WORD,而不是子字符串。
设想以下场景:
public class Test {
public static void main(String[] args) {
String[] text = {"this is a", "banana"};
String search = "a";
int counter = 0;
for(int i = 0; i < text.length; i++) {
if(text[i].toLowerCase().contains(search)) {
counter++;
}
}
System.out.println("Counter was " + counter);
}
}
评估为
Counter was 2
这不是我想要的,因为只有一个单词&#39; a&#39;在数组中。
我读它的方式如下:
if-test发现了一个&#39; a&#39;在文字[0]中,&#39; a&#39;对应于&#34;这是[a]&#34;。但是,它也发现了&#39; a&#39;在&#34; banana&#34;中,从而递增计数器。
如何解决这个问题只包含WORD&#39; a&#39;,而不是包含?
的子字符串?谢谢!
答案 0 :(得分:5)
您可以使用正则表达式,使用Pattern.quote来排除任何特殊字符。
String regex = ".*\\b" + Pattern.quote(search) + "\\b.*"; // \b is a word boundary
int counter = 0;
for(int i = 0; i < text.length; i++) {
if(text[i].toLowerCase().matches(regex)) {
counter++;
}
}
请注意,这也会在"a"
或"this is a; pause"
中找到"Looking for an a?"
,其中a
后面没有空格。
答案 1 :(得分:1)
可以这样试试:
for(int i = 0; i < text.length; i++) {
String[] words = text[i].split("\\s+");
for (String word : words)
if(word.equalsIgnoreCase(search)) {
counter++;
break;
}
}
答案 2 :(得分:0)
Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count();
答案 3 :(得分:0)
当然,正如其他人所写,您可以开始使用各种模式来“强化”匹配“单词”中的“文字”。
但问题是:根据您必须解决的潜在问题,这可能(到目前为止)还不够好。含义:你是否面临在某些字符串中找到某种模式的问题......或者它是否真的,你想要用“人类语言”的意义来解释那些文本?你知道,当有人写下文字时,可能会有一些微妙的错别字,奇怪的字符;各种各样的东西,使得很难真正“找到”该文本中的某个单词。除非你深入研究事物的“语言处理”方面。
长话短说:如果你的工作是“在字符串中找到某些模式”;然后所有其他答案都会做。但是,如果你的要求超出了这个要求,就像“有些人将使用你的应用程序'搜索'庞大的数据集”;那么你现在最好停下来;并考虑转向支持全文的搜索引擎,如ElasticSearch或Solr。
答案 4 :(得分:-1)
如果单词用空格分隔,那么你可以这样做:
if((" "+text[i].toLowerCase()+" ").contains(" "+search+" "))
{
...
}
这会在原始String中添加两个空格
例如:"this is a"
变为" this is a "
。
然后它用侧翼空格搜索单词。
例如:当" a "
为search
"a"