我有一个字符串,我必须解析不同的关键字。 例如,我有字符串:
“我会在123woods见到你”
我的关键字是
'123woods' '树林'
我应该在每次比赛时报告。还应考虑多次出现。然而,对于这个,我应该只在123woods匹配,而不是在树林。这消除了使用String.contains()方法。此外,我应该能够有一个列表/一组关键字,并同时检查它们的发生。在这个例子中,如果我有'123woods'和'come',我应该两次出现。在大文本上执行方法应该有点快。
我的想法是使用StringTokenizer,但我不确定它是否会表现良好。有什么建议吗?
答案 0 :(得分:38)
以下示例基于您的评论。它使用关键字列表,将使用字边界在给定的字符串中搜索。它使用来自Apache Commons Lang的StringUtils来构建正则表达式并打印匹配的组。
String text = "I will come and meet you at the woods 123woods and all the woods";
List<String> tokens = new ArrayList<String>();
tokens.add("123woods");
tokens.add("woods");
String patternString = "\\b(" + StringUtils.join(tokens, "|") + ")\\b";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
如果您正在寻找更高的性能,可以查看StringSearch:Java中的高性能模式匹配算法。
答案 1 :(得分:14)
在其他人接听时使用正则表达式+字边界。
"I will come and meet you at the 123woods".matches(".*\\b123woods\\b.*");
将是真的。
"I will come and meet you at the 123woods".matches(".*\\bwoods\\b.*");
将是假的。
答案 2 :(得分:10)
希望这适合你:
String string = "I will come and meet you at the 123woods";
String keyword = "123woods";
Boolean found = Arrays.asList(string.split(" ")).contains(keyword);
if(found){
System.out.println("Keyword matched the string");
}
答案 3 :(得分:9)
Arrays.asList(String.split(" ")).contains("xx")
之类的内容怎么办?
请参阅String.split()和How can I test if an array contains a certain value。
答案 4 :(得分:3)
从Android中的字符串中找到匹配 确切字的方法:
String full = "Hello World. How are you ?";
String one = "Hell";
String two = "Hello";
String three = "are";
String four = "ar";
boolean is1 = isContainExactWord(full, one);
boolean is2 = isContainExactWord(full, two);
boolean is3 = isContainExactWord(full, three);
boolean is4 = isContainExactWord(full, four);
Log.i("Contains Result", is1+"-"+is2+"-"+is3+"-"+is4);
Result: false-true-true-false
匹配词的功能:
private boolean isContainExactWord(String fullString, String partWord){
String pattern = "\\b"+partWord+"\\b";
Pattern p=Pattern.compile(pattern);
Matcher m=p.matcher(fullString);
return m.find();
}
完成强>
答案 5 :(得分:2)
尝试使用正则表达式进行匹配。匹配“\ b123wood \ b”,\ b是一个分词。
答案 6 :(得分:1)
更简单的方法是使用split():
String match = "123woods";
String text = "I will come and meet you at the 123woods";
String[] sentence = text.split();
for(String word: sentence)
{
if(word.equals(match))
return true;
}
return false;
这是一种更简单,更不优雅的方法,可以在不使用令牌等情况下执行相同的操作。
答案 7 :(得分:1)
解决方案似乎早已被接受,但解决方案可以改进,所以如果有人有类似的问题:
这是多模式搜索算法的经典应用程序。
Java模式搜索(Matcher.find
)没有资格这样做。在java中优化搜索恰好一个关键字,搜索or-expression使用正在回溯不匹配的正则表达式非确定性自动机。在更糟糕的情况下,文本的每个字符将被处理l次(其中l是模式长度的总和)。
单一模式搜索更好,但也不合格。人们将不得不开始搜索每个关键字模式。在更糟糕的情况下,文本的每个字符将被处理p次,其中p是模式的数量。
多模式搜索将仅处理文本的每个字符一次。适合于这种搜索的算法将是Aho-Corasick,Wu-Manber或Set Backwards Oracle Matching。这些可以在Stringsearchalgorithms或byteseek等库中找到。
// example with StringSearchAlgorithms
AhoCorasick stringSearch = new AhoCorasick(asList("123woods", "woods"));
CharProvider text = new StringCharProvider("I will come and meet you at the woods 123woods and all the woods", 0);
StringFinder finder = stringSearch.createFinder(text);
List<StringMatch> all = finder.findAll();
答案 8 :(得分:0)
您可以使用正则表达式。 使用Matcher和Pattern方法获得所需的输出
答案 9 :(得分:0)
您还可以使用正则表达式匹配\ b标志(整个单词边界)。
答案 10 :(得分:0)
要匹配“123woods”而不是“woods”,请在常规表达中使用原子分组。 需要注意的一点是,在一个单独匹配“123woods”的字符串中,它将匹配第一个“123woods”并退出,而不是进一步搜索相同的字符串。
\b(?>123woods|woods)\b
它搜索123woods作为主要搜索,一旦匹配就退出搜索。
答案 11 :(得分:0)
回顾最初的问题,我们需要在给定的句子中找到一些给定的关键词,计算出现次数并了解其中的某些内容。我不太明白“where”的意思是什么(它是句子中的索引?),所以我会通过那个...我还在学习java,一步一步,所以我会看到在适当的时候到那个: - )
必须注意的是,常见句子(原始问题中的句子)可以包含重复的关键词,因此搜索不仅可以询问给定关键词是否“存在”,如果确实存在则将其计为1。可以有多个相同的。例如:
// Base sentence (added punctuation, to make it more interesting):
String sentence = "Say that 123 of us will come by and meet you, "
+ "say, at the woods of 123woods.";
// Split it (punctuation taken in consideration, as well):
java.util.List<String> strings =
java.util.Arrays.asList(sentence.split(" |,|\\."));
// My keywords:
java.util.ArrayList<String> keywords = new java.util.ArrayList<>();
keywords.add("123woods");
keywords.add("come");
keywords.add("you");
keywords.add("say");
通过观察它,预期结果将是“Say”+“come”+“you”+“say”+“123woods”5,如果我们小写,则计算“说”两次。如果我们不这样做,那么计数应该是4,“Say”被排除在外并且“说”包括在内。精细。我的建议是:
// Set... ready...?
int counter = 0;
// Go!
for(String s : strings)
{
// Asking if the sentence exists in the keywords, not the other
// around, to find repeated keywords in the sentence.
Boolean found = keywords.contains(s.toLowerCase());
if(found)
{
counter ++;
System.out.println("Found: " + s);
}
}
// Statistics:
if (counter > 0)
{
System.out.println("In sentence: " + sentence + "\n"
+ "Count: " + counter);
}
结果是:
发现:说出
发现:来
发现:你
发现:说
发现:123woods
在句子中:假设我们中的123个人会来到123woods的树林中遇见你
数:5
答案 12 :(得分:0)
public class FindTextInLine {
String match = "123woods";
String text = "I will come and meet you at the 123woods";
public void findText () {
if (text.contains(match)) {
System.out.println("Keyword matched the string" );
}
}
}