Поиск слова в строке - PullRequest
       1

Поиск слова в строке

10 голосов
/ 07 октября 2010

Если я ищу определенное слово внутри строки, например, в строке «как дела», я ищу «есть». Будет ли обычный indexOf () работать быстрее и лучше или соответствовать Regex ()

String testStr = "how are you";
String lookUp = "are";

//METHOD1
if (testStr.indexOf(lookUp) != -1)
{
 System.out.println("Found!");
}

//OR
//METHOD 2
if (testStr.match(".*"+lookUp+".*"))
{
 System.out.println("Found!");
}

Какой из двух методов выше является лучшим способом поиска строки внутри другой строки? Или есть намного лучшая альтернатива?

  • Ivard

Ответы [ 9 ]

17 голосов
/ 07 октября 2010

Если вам все равно, соответствует ли это слово целиком, то indexOf() будет намного быстрее.

Если, с другой стороны, вам необходимо различать are, harebrained, aren't и т. Д., Вам необходимо регулярное выражение: \bare\b будет соответствовать только are в целом слово (\\bare\\b на Java).

\b - это якорь границы слова, который соответствует пустому пространству между буквенно-цифровым символом (буква, цифра или подчеркивание) и не буквенно-цифровым символом.

Предупреждение: это также означает, что если ваш поисковый термин на самом деле не является словом (скажем, вы ищете ###), то эти привязки границ слов будут совпадать только в строке, такой как aaa###zzz, но не в +++###+++.

Дальнейшее предостережение: по умолчанию Java имеет ограниченное представление о том, что представляет собой буквенно-цифровой символ. Здесь учитываются только буквы / цифры ASCII (плюс подчеркивание), поэтому привязки границ слов не будут работать с такими словами, как élève, relevé или ärgern. Подробнее об этом (и о том, как решить эту проблему) читайте здесь .

1 голос
/ 07 октября 2010

Если вы ищете фиксированную строку, а не образец, как в примере в вашем вопросе, indexOf будет лучше (проще) и быстрее, так как для него не нужно использовать регулярные выражения.

Кроме того, если искомая строка содержит символы, которые имеют особое значение в регулярных выражениях, при indexOf вам не нужно беспокоиться об экранировании этих символов.

Как правило, используйте indexOf, где это возможно, и match для сопоставления с образцом, где indexOf не может делать то, что вам нужно.

1 голос
/ 07 октября 2010

Метод один должен быть быстрее, потому что он имеет меньше накладных расходов.если речь идет о производительности при поиске в больших файлах, специализированный метод, такой как сопоставление по шаблону Бойера-Мура , может привести к дальнейшим улучшениям.

0 голосов
/ 30 октября 2012

Я использую это:

public boolean searchStr(String search, String what) {
    if(!search.replaceAll(what,"_").equals(search)) {
        return true;
    }
    return false;
}

Пример использования:

String s = "abc";
String w = "bc";
if(searchStr(s,w)) { 
    //this returns true
}
s="qwe";
w="asd";
if(searchStr(s,w)) { 
    //this returns false
}
0 голосов
/ 07 октября 2010

Лучшим подходом для сравнения обеих версий является анализ исходного кода метода indexOf и самих методов regex.matches, вычисление времени выполнения обеих реализаций алгоритма в Big_O_notation и сравнение их лучших, средних и худших случаев (последовательность символов найденаначало, середина или конец строки соответственно).Исходный код находится здесь indexOf_source и здесь regex.matches .Нам нужно выполнить анализ обоих во время выполнения, чтобы увидеть, что именно он делает.Сумасшедшая задача, но это единственный способ сделать истинное сравнение, а остальные - только предположения.Хороший вопрос, хотя.

0 голосов
/ 07 октября 2010

Ваш вопрос практически отвечает сам; если вам нужно спросить , является ли регулярное выражение лучшим выбором, это почти наверняка не так. Кроме того, когда вы выбираете между решениями regex и non-regex, производительность никогда не должна быть вашим основным критерием. Подождите, пока у вас не будет рабочего кода, и профилируйте его.

0 голосов
/ 07 октября 2010

конечно indexOf() лучше match(). один метод match () состоит из множества сравнений: a == a, r == r, e == e; в то же время вы добавляете символы подстановки, которые можно разделить на несколько случаев:

  1. ? * Есть 1006 * ?? есть
    ??? являются
    ???? есть
    ........ есть есть? являются?? есть ???

до тех пор, пока она не станет такой же, как исходные строки.

0 голосов
/ 07 октября 2010

Первый метод быстрее, и, поскольку он не является сложным выражением, нет смысла использовать регулярное выражение здесь.

0 голосов
/ 07 октября 2010

Если вы ищете одну строку внутри другой, вы должны использовать indexOf или contains метод. Пример: посмотрите, присутствует ли "foo" в строке.

Но если вы ищете шаблон , используйте метод match.
Пример: посмотрите, присутствует ли "foo" в начале / конце строки. Или посмотрите, присутствует ли оно как целое слово.

Использование метода match для простого поиска строк неэффективно из-за накладных расходов движка regex.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...