Теги: java, string, символ, поиск, строка, метод, буква, знак, contains
В этой статье мы рассмотрим, как выполнять поиск букв и других символов в строке Java, а также как проверять, находится ли нужный символ, буква или слово в строке, начиная с указанного индекса.
Строкой в Java называют упорядоченную последовательность символов. Как правило строка в Java — это один из основных носителей текстовой информации.
Для работы со строками в Java применяют классы String, StringBuilder и StringBuffer. Класс String включает методы, возвращающие позицию символа либо подстроки в строке:
— indexOf() — для поиска с начала строки;
— lastIndexOf() — для выполнения поиска с конца строки.
Таким образом, если метод indexOf() найдёт заданную букву, символ либо строку, он вернёт индекс, то есть порядковый номер. Если не найдёт, будет возвращено -1. Также он позволяет искать символ или букву, начиная с указанного индекса.
Кроме того, стоит добавить, что класс String включает в себя ещё и метод contains, возвращающий true, когда в строке содержится заданная последовательность символов. Этот метод рекомендуется использовать лишь тогда, когда вам просто нужно узнать о существовании подстроки в строке, при этом позиция не имеет значения.
Метод indexOf()
Библиотека метода:
Синтаксис следующий:
public int indexOf(char ch) public int indexOf(char ch, int fromIndex)либо
public int indexOf(String s) public int indexOf(String s, int fromIndex)Соответственно, вызвать метод можно тоже несколькими способами:
int index = str1.indexOf(myChar); int index = str1.indexOf(myChar, start);или:
int index = str1.indexOf(myString); int index = str1.indexOf(myString, start);Представьте, что нам нужно отыскать в строке индекс первого вхождения требуемого символа/буквы, а также нужного слова. Как уже было сказано выше, метод indexOf() вернёт нам индекс первого вхождения, а в случае неудачи — вернёт -1.
Посмотрите на следующий код:
public class Main { public static void main(String[] args) { String str = "Otus — онлайн-образование"; int indexM = str.indexOf("з"); // Ищем символ в строке int indexJava = str.indexOf("онлайн"); // Ищем слово в строке if(indexM == - 1) { System.out.println("Символ "з" не найден."); } else { System.out.println("Символ "з" найден, его индекс: " + indexM); } if(indexJava == - 1) { System.out.println("Слово "онлайн" не найдено."); } else { System.out.println("Слово "онлайн" найдено, его индекс: " + indexJava); } } }Результат получим следующий:
Символ "з" найден, его индекс: 18 Слово "онлайн" найдено, его индекс: 7Метод contains
Бывают ситуации, когда нам необходимо проверить, содержит ли наша строка конкретный символ/букву либо слово. Нижеследующий Java-код продемонстрирует и этот пример:
public class Main { public static void main(String[] args) { String str = "Otus — онлайн-образование"; System.out.println("Слово "Otus" есть в строке str? Ответ: " + str.contains("Otus")); System.out.println("Символ "z" присутствует в строке str? Ответ: " + str.contains("z")); } }В этом случае результат будет следующим:
Слово "Otus" есть в строке str? Ответ: true Символ "z" присутствует в строке str? Ответ: falseКак видите, выполнять поиск букв и других символов в строке Java совсем несложно, и наши элементарные примеры убедительно это подтверждают. Если же вы хотите получить более продвинутые навыки по Java-разработке, добро пожаловать на наш курс:
Strings are a very important aspect from a programming perspective as many questions can be framed out among strings. There arise wide varied sets of concepts and questions that are pivotal to understanding strings. Now over here will be discussing different ways to play with strings where we will be playing with characters with strings and substrings which is a part of input strings with help of inbuilt methods and also by proposing logic listing wide varied ways as follows:
Searching a Character in the String
Way 1: indexOf(char c)
It searches the index of specified characters within a given string. It starts searching from the beginning to the end of the string (from left to right) and returns the corresponding index if found otherwise returns -1.
Note: If the given string contains multiple occurrences of a specified character then it returns the index of the only first occurrence of the specified character.
Syntax:
int indexOf(char c) // Accepts character as argument, Returns index of // the first occurrence of specified character
Way 2: lastIndexOf(char c)
It starts searching backward from the end of the string and returns the index of specified characters whenever it is encountered.
Syntax:
public int lastIndexOf(char c) // Accepts character as argument, Returns an // index of the last occurrence specified // character
Way 3: indexOf(char c, int indexFrom)
It starts searching forward from the specified index in the string and returns the corresponding index when the specified character is encountered otherwise returns -1.
Note: The returned index must be greater than or equal to the specified index.
Syntax:
public int IndexOf(char c, int indexFrom)
Parameters:
- The character to be searched
- An integer from where searching
Return Type: An index of a specified character that appeared at or after the specified index in a forwarding direction.
Way 4: lastIndexOf(char c, int fromIndex)
It starts searching backward from the specified index in the string. And returns the corresponding index when the specified character is encountered otherwise returns -1.
Note: The returned index must be less than or equal to the specified index.
Syntax:
public int lastIndexOf(char c, int fromIndex)
Way 5: charAt(int indexNumber)
Returns the character existing at the specified index, indexNumber in the given string. If the specified index number does not exist in the string, the method throws an unchecked exception, StringIndexOutOfBoundsException.
Syntax:
char charAt(int indexNumber)
Example:
Java
import
java.io.*;
class
GFG {
public
static
void
main(String[] args)
{
String str
=
"GeeksforGeeks is a computer science portal"
;
int
firstIndex = str.indexOf(
's'
);
System.out.println(
"First occurrence of char 's'"
+
" is found at : "
+ firstIndex);
int
lastIndex = str.lastIndexOf(
's'
);
System.out.println(
"Last occurrence of char 's' is"
+
" found at : "
+ lastIndex);
int
first_in = str.indexOf(
's'
,
10
);
System.out.println(
"First occurrence of char 's'"
+
" after index 10 : "
+ first_in);
int
last_in = str.lastIndexOf(
's'
,
20
);
System.out.println(
"Last occurrence of char 's'"
+
" after index 20 is : "
+ last_in);
int
char_at = str.charAt(
20
);
System.out.println(
"Character at location 20: "
+ char_at);
}
}
Output
First occurrence of char 's' is found at : 4 Last occurrence of char 's' is found at : 28 First occurrence of char 's' after index 10 : 12 Last occurrence of char 's' after index 20 is : 15 Character at location 20: 111
Way 6: Searching Substring in the String
The methods used for searching a character in the string which are mentioned above can also be used for searching the substring in the string.
Example
Java
import
java.io.*;
class
GFG {
public
static
void
main(String[] args)
{
String str
=
"GeeksforGeeks is a computer science portal"
;
int
firstIndex = str.indexOf(
"Geeks"
);
System.out.println(
"First occurrence of char Geeks"
+
" is found at : "
+ firstIndex);
int
lastIndex = str.lastIndexOf(
"Geeks"
);
System.out.println(
"Last occurrence of char Geeks is"
+
" found at : "
+ lastIndex);
int
first_in = str.indexOf(
"Geeks"
,
10
);
System.out.println(
"First occurrence of char Geeks"
+
" after index 10 : "
+ first_in);
int
last_in = str.lastIndexOf(
"Geeks"
,
20
);
System.out.println(
"Last occurrence of char Geeks "
+
"after index 20 is : "
+ last_in);
}
}
Output
First occurrence of char Geeks is found at : 0 Last occurrence of char Geeks is found at : 8 First occurrence of char Geeks after index 10 : -1 Last occurrence of char Geeks after index 20 is : 8
Way 7: contains(CharSequence seq): It returns true if the string contains the specified sequence of char values otherwise returns false. Its parameters specify the sequence of characters to be searched and throw NullPointerException if seq is null.
Syntax:
public boolean contains(CharSequence seq)
Note: CharSequence is an interface that is implemented by String class, Therefore we use string as an argument in contains() method.
Example
Java
import
java.io.*;
import
java.lang.*;
class
GFG {
public
static
void
main(String[] args)
{
String test =
"software"
;
CharSequence seq =
"soft"
;
boolean
bool = test.contains(seq);
System.out.println(
"Found soft?: "
+ bool);
boolean
seqFound = test.contains(
"war"
);
System.out.println(
"Found war? "
+ seqFound);
boolean
sqFound = test.contains(
"wr"
);
System.out.println(
"Found wr?: "
+ sqFound);
}
}
Output
Found soft?: true Found war? true Found wr?: false
Way 8: Matching String Start and End
- boolean startsWith(String str): Returns true if the string str exists at the starting of the given string, else false.
- boolean startsWith(String str, int indexNum): Returns true if the string str exists at the starting of the index indexNum in the given string, else false.
- boolean endsWith(String str): Returns true if the string str exists at the ending of the given string, else false.
Example:
Java
import
java.io.*;
class
GFG {
public
static
void
main(String[] args)
{
String str
=
"GeeksforGeeks is a computer science portal"
;
System.out.println(str.startsWith(
"Geek"
));
System.out.println(str.startsWith(
"is"
,
14
));
System.out.println(str.endsWith(
"port"
));
}
}
This article is contributed by Nitsdheerendra. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Last Updated :
16 Feb, 2023
Like Article
Save Article
Описание проблемы
Как найти символ или слово в строке?
Решение 1: когда нужно найти индекс первого вхождения
Следующий пример показывает как найти символ или слово в строке в Java с помощью метода indexOf(). Метод вернет индекс первого вхождения, если символ или слово не будет найдено, то метод вернет -1.
public class Example {
public static void main(String[] args) {
String str = "Привет, java-программист!";
int indexM = str.indexOf("м"); // Нахождение символа в строке
int indexJava = str.indexOf("java"); // Нахождение слова в строке
if(indexM == - 1) {
System.out.println("Символ "м" не найден.");
} else {
System.out.println("Символ "м" найден в индексе " + indexM);
}
if(indexJava == - 1) {
System.out.println("Слово "java" не найдено.");
} else {
System.out.println("Слово "java" найдено в индексе " + indexJava);
}
}
}
Результат
Получим следующий результат:
Символ "м" найден в индексе 19
Слово "java" найдено в индексе 8
Решение 2: когда нужно узнать есть ли в строке данный символ или слово
Ниже продемонстрирован пример, который позволяет в Java узнать присутствует ли данный символ или слово в строке.
public class Example {
public static void main(String[] args) {
String str = "Привет, java-программист!";
System.out.println("Слово "программист" есть в строке str? Ответ: " + str.contains("программист"));
System.out.println("Символ "б" присутствует в строке str? Ответ: " + str.contains("б"));
}
}
Результат
Получим следующий результат:
Слово "программист" есть в строке str? Ответ: true
Символ "б" присутствует в строке str? Ответ: false
Если вам нужен чистый код, то можно сделать так:
private static final char[] DELIMITERS = {'&', '@', '+', '*', '%'};
public static void main(String[] args) {
String input = "White@Black", operand1, operator, operand2;
for (char c : DELIMITERS) {
int index = input.indexOf(c);
if(index != -1) {
operand1 = input.substring(0, index);
operator = String.valueOf(c);
operand2 = input.substring(index + 1);
break;
}
}
}
Хотя ваш вариант в целом неплох и намного быстрее с точки зрения производительности, чем предыдущий. А если его записать следующим образом, то выглядит довольно чисто, правда, кода больше.
private static final char[] DELIMITERS = {'&', '@', '+', '*', '%'};
private static boolean isDelimeter(char c) {
for (char delimiter : DELIMITERS)
if(c == delimiter)
return true;
return false;
}
public static void main(String[] args) {
String input = "White@Black", operand1, operator, operand2;
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (isDelimeter(c)) {
operand1 = input.substring(0, i);
operator = String.valueOf(c);
operand2 = input.substring(i + 1);
break;
}
}
}
Проверка на наличие подстрок в строке – довольно распространенная задача в программировании. Например, иногда мы хотим разбить строку, если она содержит разделитель в точке. В других случаях мы хотим изменить поток, если строка содержит (или не имеет) определенную подстроку, которая может быть командой.
Есть несколько способов сделать это в Java, и большинство из них – то, что вы ожидаете увидеть и в других языках программирования. Однако один из подходов, уникальных для Java, – это использование класса Pattern
, о котором мы расскажем позже в этой статье.
В качестве альтернативы вы можете использовать Apache Commons и вспомогательный класс StringUtils
, который предлагает множество производных методов из основных методов для этой цели.
Основные способы Java
String.contains()
Первый и главный способ проверить наличие подстроки – это метод .contains()
. Это обеспечивается самим классом String
и очень эффективно.
Метод принимает CharSequence
и возвращает true
, если последовательность присутствует в строке, для которой мы вызываем метод:
String string = "Java";
String substring = "va";
System.out.println(string.contains(substring));
Запуск этого даст:
Примечание: метод .contains()
чувствителен к регистру. Если бы мы попытались искать "Va"
в нашем string
, результат будет false
.
Часто, чтобы избежать этой проблемы, так как мы не хотим быть чувствительны к регистру, вы должны сопоставить регистр обеих строк перед проверкой:
System.out.println(string.toLowerCase().contains(substring.toLowerCase()));
// OR
System.out.println(string.toUpperCase().contains(substring.toUpperCase()));
String.indexOf()
Метод .indexOf()
возвращает индекс первого вхождения подстроки в строке и предлагает несколько конструкторов на выбор:
indexOf(int ch)
indexOf(int ch, int fromIndex)
indexOf(String str)
indexOf(String str, int fromIndex)
Мы можем либо искать один символ со смещением или без него, либо искать строку со смещением или без него.
Метод вернет индекс первого вхождения, если присутствует, и -1
если нет:
String string = "Lorem ipsum dolor sit amet.";
// You can also use unicode for characters
System.out.println(string.indexOf('i'));
System.out.println(string.indexOf('i', 8));
System.out.println(string.indexOf("dolor"));
System.out.println(string.indexOf("Lorem", 10));
Запуск этого кода даст:
- Первое вхождение
i
в словеipsum
, имеет индекс 6 от начала последовательности символов. - Первое вхождение
i
со смещением8
находится в словеsit
, имеет индекс 19 от начала. - Первое вхождение String
dolor
– имеет индекс 12 с начала. - И, наконец, слова
Lorem
нет при смещении10
.
В конечном счете, метод .contains()
внутри себя вызывает метод .indexOf()
. Это делает .indexOf()
даже более эффективным, чем аналог (хотя и очень небольшой), хотя у него есть несколько иной вариант использования.
String.lastIndexOf()
В отличие от метода .indexOf()
, который возвращает первое вхождение, метод .lastIndexOf()
возвращает индекс последнего вхождения символа или строки со смещением или без него:
String string = "Lorem ipsum dolor sit amet.";
// You can also use unicode for characters
System.out.println(string.lastIndexOf('i'));
System.out.println(string.lastIndexOf('i', 8));
System.out.println(string.lastIndexOf("dolor"));
System.out.println(string.lastIndexOf("Lorem", 10));
Запуск этого кода даст:
Некоторые могут быть немного удивлены результатами и скажут:
lastIndexOf('i', 8)
должен был вернуть 19
, так как это последнее вхождение символа после 8-го символа в строке
Стоит отметить, что при запуске метода .lastIndexOf()
последовательность символов меняется на противоположную. Отсчет начинается с последнего символа и идет к первому.
Это, как говорится – ожидаемый результат – 6
последнее появление символа после пропуска 8 элементов из конца последовательности.
Шаблон с регулярным выражением и Matcher
Класс Pattern
существенно скомпилированное представление регулярного выражения. Он используется вместе с классом Matcher
для сопоставления последовательностей символов.
Этот класс в первую очередь работает путем компиляции шаблона. Затем мы присваиваем другой шаблон экземпляру Matcher
, который использует метод .find()
для сравнения назначенных и скомпилированных шаблонов.
Если они совпадают, метод .find()
приводит к true
. Если шаблоны не совпадают, метод приводит к false
.
Pattern pattern = Pattern.compile(".*" + "some" + ".*");
Matcher matcher = pattern.matcher("Here is some pattern!");
System.out.println(matcher.find());
Это даст:
Apache Commons
Из-за его полезности и распространенности в Java, во многих проектах Apache Commons включен в classpath. Это отличная библиотека со многими полезными функциями, часто используемыми в производстве, и проверка подстрок не является исключением.
Apache Commons предлагает класс StringUtils
со многими вспомогательными методами для манипуляций со строками, нуль-проверка и т.д. Для решения этой задачи, мы можем использовать любого из методов .contains()
, .indexOf()
, .lastIndexOf()
или .containsIgnoreCase()
.
Если нет, то это так же просто, как добавить зависимость к вашему файлу pom.xml
, если вы используете Maven:
org.apache.commons
commons-lang3
{version}
Или добавив его через Gradle:
compile group: 'org.apache.commons', name: 'commons-lang3', version: '{version}'
StringUtils.contains()
Метод .contains()
довольно прост и очень похож на основной Java подход.
Единственное отличие состоит в том, что мы не вызываем метод для проверяемой строки (поскольку он не наследует этот метод), а вместо этого передаем искомую строку вместе со строкой, которую мы ищем:
String string = "Checking for substrings within a String is a fairly common task in programming.";
System.out.println(StringUtils.contains(string, "common task"));
Запуск этого кода даст:
Примечание: этот метод чувствителен к регистру.
StringUtils.indexOf()
Естественно, метод .indexOf()
также работает очень похоже на основной подход Java:
String string = "Checking for substrings within a String is a fairly common task in programming.";
// Search for first occurrence of 'f'
System.out.println(StringUtils.indexOf(string, 'f'));
// Search for first occurrence of 'f', skipping the first 12 elements
System.out.println(StringUtils.indexOf(string, 'f', 12));
// Search for the first occurrence of the "String" string
System.out.println(StringUtils.indexOf(string, "String"));
Запуск этого кода даст:
StringUtils.indexOfAny()
Метод .indexOfAny()
принимает список символов, а не один, что позволяет нам искать первое вхождение любого из переданных символов:
String string = "Checking for substrings within a String is a fairly common task in programming.";
// Search for first occurrence of 'f' or 'n', whichever comes first
System.out.println(StringUtils.indexOfAny(string, 'f', 'n'));
// Search for the first occurrence of "String" or "for", whichever comes first
System.out.println(StringUtils.indexOfAny(string, "String", "for"));
Запуск этого кода даст:
StringUtils.indexOfAnyBut()
Метод .indexOfAnyBut()
ищет первое вхождение любого символа, что это не в предоставленном комплекте:
String string = "Checking for substrings within a String is a fairly common task in programming.";
// Search for first character outside of the provided set 'C' and 'h'
System.out.println(StringUtils.indexOfAny(string, 'C', 'h'));
// Search for first character outside of the provided set 'C' and 'h'
System.out.println(StringUtils.indexOfAny(string, "Checking", "for"));
Запуск этого кода даст:
StringUtils.indexOfDifference()
Метод .indexOfDifference()
сравнивает два массива символов, и возвращает индекс первого символа, отличающийся:
String s1 = "Hello World!"
String s2 = "Hello world!"
System.out.println(StringUtils.indexOfDifference(s1, s2));
Запуск этого кода даст:
StringUtils.indexOfIgnoreCase()
Метод .indexOfIgnoreCase()
возвращает индекс первого вхождения символа в последовательности символов, игнорируя случай:
String string = "Checking for substrings within a String is a fairly common task in programming."
System.out.println(StringUtils.indexOf(string, 'c'));
System.out.println(StringUtils.indexOfIgnoreCase(string, 'c'));
Запуск этого кода даст:
StringUtils.lastIndexOf()
И, наконец, метод .lastIndexOf()
работает почти так же, как обычный Java-метод:
String string = "Lorem ipsum dolor sit amet.";
// You can also use unicode for characters
System.out.println(StringUtils.lastIndexOf(string, 'i'));
System.out.println(StringUtils.lastIndexOf(string, 'i', 8));
System.out.println(StringUtils.lastIndexOf(string, "dolor"));
System.out.println(StringUtils.lastIndexOf(string, "Lorem", 10));
Запуск этого кода даст:
StringUtils.containsIgnoreCase()
В методе .containsIgnoreCase()
, проверяет содержит строка подстроку, не обращая внимания на случай:
String string = "Checking for substrings within a String is a fairly common task in programming.";
System.out.println(StringUtils.containsIgnoreCase(string, "cOmMOn tAsK"));
Запуск этого кода даст:
StringUtils.containsOnly()
Метод .containsOnly()
проверяет, если последовательность символов содержит только указанные значения.
Это может вводить в заблуждение, поэтому можно сказать, что это еще один способ – он проверяет, состоит ли последовательность символов только из указанных символов. Он принимает либо строку, либо последовательность символов:
String string = "Hello World!"
System.out.println(StringUtils.containsOnly(string, 'HleWord!'));
System.out.println(StringUtils.containsOnly(string, "wrld"));
Запуск этого даст:
Строка "Hello World!"
действительно построена только из символов в последовательности 'HleWord!'
.
Примечание: не все символы из последовательности необходимо использовать в методе string
для возврата true. Важно то, что в нем нет символа, которого нет в последовательности символов.
StringUtils.containsNone()
Метод .containsNone()
, содержит ли строка какой – либо из «запрещенных» символов из набора:
String string = "Hello World!"
System.out.println(StringUtils.containsNone(string, 'xmt'));
System.out.println(StringUtils.containsNone(string, "wrld"));
Запуск этого кода дает:
StringUtils.containsAny()
И наконец, метод .containsAny()
возвращает true
, если последовательность символов содержит какой-либо из переданных параметров в форме последовательности символов или строки:
String string = "Hello World!"
System.out.println(StringUtils.containsAny(string, 'h', 'm'));
System.out.println(StringUtils.containsAny(string, "hell"));
Этот код даст: