检查字符串是否包含单词(不是子字符串!)
Check if string contains word (not substring!)
有没有办法检查子字符串是否包含整个 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
这不是我要查找的内容,因为数组中只有一个单词 'a' 的实例。
我的阅读方式是这样的:
if-test 在文本[0] 中找到一个'a','a' 对应于"this is [a]"。但是,它还会在 "banana" 中找到 'a' 的出现,从而增加计数器。
如何解决此问题以仅包含 WORD 'a',而不包含包含 a 的子字符串?
谢谢!
如果单词之间用 space 分隔,那么你可以这样做:
if((" "+text[i].toLowerCase()+" ").contains(" "+search+" "))
{
...
}
这会将两个 space 添加到原始字符串。
例如:"this is a"
变为 " this is a "
.
然后它搜索带有侧翼 space 的单词。
例如:当 search
是 "a"
时搜索 " a "
您可以使用正则表达式,使用 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++;
}
}
请注意,这还会在 "this is a; pause"
或 "Looking for an a?"
中找到 "a"
,其中 a
后面没有 space。
可以这样试试:
for(int i = 0; i < text.length; i++) {
String[] words = text[i].split("\s+");
for (String word : words)
if(word.equalsIgnoreCase(search)) {
counter++;
break;
}
}
Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count();
当然,正如其他人所写,您可以开始使用各种模式来 匹配 "words" 出 "text"。
但问题是:根据您必须解决的潜在问题,这可能(到目前为止)还不够好。意思是:您是否面临在某个字符串中找到某种模式的问题……或者您真的想要在 "human language" 意义上解释该文本吗?你知道,当有人写下文字时,可能会有细微的错别字、奇怪的字符;各种各样的东西使得很难真正 "find" 该文本中的某个词。除非你深入研究事物的 "language processing" 方面。
长话短说:如果您的工作是 "locate certain patterns in strings";那么所有其他答案都可以。但是,如果您的要求超出此范围,例如 "some human will be using your application to 'search' huge data sets";那你最好现在停下来;并考虑转向启用全文搜索引擎,例如 ElasticSearch 或 Solr。
有没有办法检查子字符串是否包含整个 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
这不是我要查找的内容,因为数组中只有一个单词 'a' 的实例。
我的阅读方式是这样的:
if-test 在文本[0] 中找到一个'a','a' 对应于"this is [a]"。但是,它还会在 "banana" 中找到 'a' 的出现,从而增加计数器。
如何解决此问题以仅包含 WORD 'a',而不包含包含 a 的子字符串?
谢谢!
如果单词之间用 space 分隔,那么你可以这样做:
if((" "+text[i].toLowerCase()+" ").contains(" "+search+" "))
{
...
}
这会将两个 space 添加到原始字符串。
例如:"this is a"
变为 " this is a "
.
然后它搜索带有侧翼 space 的单词。
例如:当 search
是 "a"
" a "
您可以使用正则表达式,使用 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++;
}
}
请注意,这还会在 "this is a; pause"
或 "Looking for an a?"
中找到 "a"
,其中 a
后面没有 space。
可以这样试试:
for(int i = 0; i < text.length; i++) {
String[] words = text[i].split("\s+");
for (String word : words)
if(word.equalsIgnoreCase(search)) {
counter++;
break;
}
}
Arrays.asList("this is a banana".split(" ")).stream().filter((s) -> s.equals("a")).count();
当然,正如其他人所写,您可以开始使用各种模式来 匹配 "words" 出 "text"。
但问题是:根据您必须解决的潜在问题,这可能(到目前为止)还不够好。意思是:您是否面临在某个字符串中找到某种模式的问题……或者您真的想要在 "human language" 意义上解释该文本吗?你知道,当有人写下文字时,可能会有细微的错别字、奇怪的字符;各种各样的东西使得很难真正 "find" 该文本中的某个词。除非你深入研究事物的 "language processing" 方面。
长话短说:如果您的工作是 "locate certain patterns in strings";那么所有其他答案都可以。但是,如果您的要求超出此范围,例如 "some human will be using your application to 'search' huge data sets";那你最好现在停下来;并考虑转向启用全文搜索引擎,例如 ElasticSearch 或 Solr。