2014-10-28 37 views
0

我正在尝试创建一个静态方法“indexOfKeyword”并返回一个indexOf字符串,其中的字符串未嵌入到另一个字中。如果没有这种情况,它会返回-1。如何在另一个字符串中找到没有嵌入另一个字词的字符串?

例如,

String s = "In Florida, snowshoes generate no interest."; 
String keyword = "no"; 

这将返回31

我相信没有被查找的字符串关键字的下一个出现的唯一问题。我至今是:

public static int indexOfKeyword(String s, String keyword) 
{ 

s = s.toLowerCase(); 
keyword = keyword.toLowerCase(); 


int startIdx = s.indexOf(keyword); 



while (startIdx >= 0) 
{ 

String before = " "; 
String after = " "; 

if (startIdx > 0){ 

    before = s.substring(startIdx - 1 , startIdx); 
} 


int endIdx = startIdx; 


if (endIdx < s.length()){ 

    after = s.substring(startIdx + keyword.length() , startIdx + keyword.length() + 1); 
} 


if (!(before.compareTo("a") >= 0 && before.compareTo("z") <= 0 && after.compareTo("a") >= 0 &&  after.compareTo("z") <= 0)){ 
    return startIdx; 
} 




startIdx = 
    /* expression using 2-input indexOf for the start of the next occurrence */ 

} 


    return -1; 
} 


public static void main(String[] args) 
{ 
// ... and test it here 
String s = ""; 
String keyword = ""; 

System.out.println(indexOfKeyword(s, keyword)); 
} 
+0

谢谢回答大家,但我忘了提,我试图做一个静态方法“indexOfKeyword”使用佛罗里达州的例子是行不通的 – Oninez 2014-10-28 02:40:34

回答

2

事情是这样的:没有嵌入另一个词

String input = "In Florida, snowshoes generate no interest."; 
String pattern = "\\bno\\b"; 
Matcher matcher = Pattern.compile(pattern).matcher(input); 

return matcher.find() ? matcher.start() : -1; 

字符串不是用空格分隔的必然。它可以是逗号,句点,字符串的开头等。

上述解决方案使用正则表达式的字边界(\b)给出正确的解决方案。


如果有含正则表达式中使用时,是具有特殊含义的字符关键字的风险,你可能想先逃避它:

String pattern = "\\b" + Pattern.quote(keyword) + "\\b"; 

因此,一个完整的方法实现可能看起来像这样的:

public static int indexOfKeyword(String s, String keyword) { 
    String pattern = "\\b" + Pattern.quote(keyword) + "\\b"; 
    Matcher matcher = Pattern.compile(pattern).matcher(s); 

    return matcher.find() ? matcher.start() : -1; 
} 
+1

值得向他展示如何将他的关键字转化为正则表达式 – 2014-10-28 02:41:27

+1

@KeithNicholas感谢您的帮助! – 2014-10-28 02:49:08

+1

+1我不得不说,我特别喜欢return语句,该语句整齐地调用'find()',它也*改变匹配器,允许'start()'立即被内联调用。 – Bohemian 2014-10-28 02:53:33

相关问题