如何在另一个字符串中找到字符串的出现,而这个字符串没有嵌入到另一个字中?

时间:2014-10-28 02:33:34

标签: java

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

例如,

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

这将返回31。

我认为唯一的问题不是找到下一个出现的string关键字。到目前为止我所拥有的是:

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 ) ); 
} 

1 个答案:

答案 0 :(得分: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;
}