Лучший способ найти значение в строках, разделенных запятыми (Java/Android)

Предположим, что указанная строка:

String list = "apples,orange,bears,1,100,20,apple";

Не отделяя список от коллекции или массива, есть ли лучший способ найти строку в списке? Например, если я ищу "bear", не должно быть, поскольку точное совпадение не будет (bears не учитываются). Вы не можете искать " ,bear," так как нет гарантии, что слово "медведь" не появится в начале или конце файла.

5 ответов

Вы все еще можете использовать что-то вроде:

(^|,)bears(,|$)

Он будет искать запятые, или начало или конец строки, которые, я считаю, это то, что вы ищете.

EDIT: добавление

Поскольку Denomales упомянул об этом, вышеупомянутый поиск в регулярном выражении будет потреблять любые запятые (если они есть), которые он может найти, так что вы получите совпадающие совпадения в случае списков, таких как apples,orange,bears,honey,bears,bears,bears,bears,9999,bees и будет считать только 3 медведей из 5 настоящих. То, что вы можете сделать в этом случае, - это использование обратных ссылок. Это может занять немного, чтобы обдумать их, но суть в том, что они оглядываются или опережают персонажей, не потребляя их. Таким образом, можно найти всех 5 медведей, и именно так вы их используете:

(?<=^|,)bears(?=,|$)

Разбивка символов...

^ означает начало строки, так что в случае отсутствия запятых вы все равно получите совпадение.

, является буквальной запятой.

(?<=... ) является положительным и просмотром назад заглянуть за b символа в bears, чтобы убедиться, что внутри, то есть либо ^ или ,.

(?=... ) является положительным взглядом и будет следить за характером s в bears чтобы убедиться, что внутри есть то, что является либо a , либо $.

$ означает конец строки, работающий очень похоже на ^, но в конце.


Вы можете использовать lookahead и lookbehind, чтобы проверить, что вокруг искомого слова, не захватывая *. Пример:

Pattern p = Pattern.compile("(?<=,|^)bears(?=,|$)");

(* однако, если вы хотите только проверить наличие слова "медведи", это не очень важно)


Я не уверен, хотите ли вы посмотреть, происходит ли совпадение или где происходит совпадение. Самый простой способ увидеть, является ли совпадение, - это позвонить

list.matches("(^|(.*,))bear((,.*)|$)");

^ Проверяет, находится ли медведь в начале строки. | означает или. .* Ищет нуля или более символов и тому , просто ищет запятой. $ Представляет конец строки. Скобки используются как условия соответствия, но не обязательно являются частью того, что вы хотите искать (то есть bear). Для получения дополнительной информации см. Класс Java Pattern.

Если вы хотите знать, где это происходит, это простой способ.

String list = "apples,orange,bear,1,100,20,apple";//Notice that I made "bear" singular
Pattern pattern = Pattern.compile((?<=^|,)bear(?=,|$));//Compile the regex
Matcher matcher = pattern.matcher(list);//The text you want to search in
// Check all occurrences
while (matcher.find()) {
 System.out.print("Start index: " + matcher.start());
 System.out.print(" End index: " + matcher.end());
 System.out.println(" Found: " + matcher.group());
}

который печатает

Start index: 14 End index: 18 Found: bear

Оба этих решения используют регулярные выражения.


add ',' в начале и в конце строки

newList = ",apples,orange,bears,1,100,20,apple,";

то вы можете искать ,bear,


Добавить ',' в начале и в конце строки

Это решение имеет проблему. Это добавление ',' до и после обеих строк для сравнения требует конкатенации String. Это означает создание 2*2=4 новых объектов String. Это очень плохо с точки зрения производительности.

licensed under cc by-sa 3.0 with attribution.