Elettracompany.com

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java string matches regex

Руководство по Java. Регулярные выражения Java.

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

Регулярные выражения в Java обеспечиваются пакетом java.util.regex.

В пакете java.util.regex ключевыми являются 3 класса:

  • Matcher
    Этот клсс интерпретирует шаблон и предоставляет определяет совпадения в водимой строке.
  • Pattern
    Класс Pattern предоставляет нам скомпилированный вариант регулярного выражения.
  • PatternSyntaxException
    Этот класс предоставляет нам непроверяемые исключения, которые указывают нам на синтаксическую ошибку в нашем регулярном выражении.

Схватывающая группа

Схватывающая группа – это способ представить несколько символов, как единый элемент. Они создаются путём размещения символов внутри множества скобок. Например, слово (car) создаёт единую группу, которая состоит из букв “c”, “a” и “r”.

Для того, чтобы понять, как это применяется на практике, рассмотрим пример простого приложения.

В результате работы программы мы получим такой результат:

Здесь приведён крайне примитывный способ найти номер телефона в строке. На практике, для такой операции понадобиться более сложный шаблон, но в качестве примера нас устроит и такой вариант.

Как мы видим, мы применяем регулярное выражение d, которое выводит числа (от 0 до 9). В результате программа опускает все нечисловые символы в строке и возвращает нам только номер телефона.

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

Методы класса Matcher

В классе Matcher есть ряд методов, для определения места совпадения.

  • public int start()
    Возвращает начальный индекс предыдущего совпадения.
  • public int start(int group)
    Возвращает начальный идндекс подстроки, захваченной данной группой во время предыдущего совпадения.
  • public int end()
    Возвращает смещение после крайнего совпадающего символа.
  • public int end(int group)
    Возвращает смещение после крайнего символа подстроки, захваченного данной группой во время крайнего совпадения.

Методы поиска

Методы поиска предназначены для того, чтобы узнать есть ли в водимй строке указанный шаблон (pattern).

Вот список методов поиска:

  • public boolean lookingAt()
    Ищет совпадения вводной строки и шаблона.
  • public boolean find()
    Ищет подстроку вводной строки, которая совпадает с шаблоном.
  • public boolean find(int start)
    Ищет подстроку вводной строки, которая совпадает с шаблоном начиная с указанного индекса.
  • public boolean matches()
    Ищет совпадения всей строки и шаблона.

Методы замещения

Для замещения текста в вводной строке в языке Java предусмотрены следующие методы:

  • public Matcher appendReplacement(StringBuffer sb, String replacement)
    Метод реализует объединение и замену строки.
  • public StringBuffer appendTail(StringBuffer sb)
    Метод реализует объединение и замену строки.
  • public String replaceAll(String replacement)
    Заменяет все подстроки вводной строки, которая совпадает с шаблоном, указанным в вводной строке.
  • public String replaceFirst(String replacement)
    Заменяет первую подстроку вводной строки, которая совпадает с шаблоном.
  • public static String quoteReplacement(String s)
    Этот метод возвращает литералбную замену стоки для указанной строки.

Для понимания того, как все эти методы работают на практике, рассмотрим примеры простых приложений.

Метод find()

В результате работы программы мы получим следующий результат:

Метод lookingAt()
Пример:

В результате работы программы мы получим следующий результат:

Метод replaceAll()
Пример:

В результате работы программы мы получим следующий результат:

Метод appendReplacement()
Пример:

В результате работы программы мы получим следующий результат:

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

В следующем уроке мы более глубоко изучим, что такое методы и как они работают в языке программирования Java.

Методы RegExp и String

В этой главе мы рассмотрим все детали методов для работы с регулярными выражениями.

str.match(regexp)

Метод str.match(regexp) ищет совпадения с regexp в строке str .

У него есть три режима работы:

Если у регулярного выражения нет флага g , то он возвращает первое совпадение в виде массива со скобочными группами и свойствами index (позиция совпадения), input (строка поиска, равна str ):

Если у регулярного выражения есть флаг g , то он возвращает массив всех совпадений, без скобочных групп и других деталей.

Если совпадений нет, то, вне зависимости от наличия флага g , возвращается null .

Это очень важный нюанс. При отсутствии совпадений возвращается не пустой массив, а именно null . Если об этом забыть, можно легко допустить ошибку, например:

Если хочется, чтобы результатом всегда был массив, можно написать так:

str.matchAll(regexp)

Метод str.matchAll(regexp) – «новый, улучшенный» вариант метода str.match .

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

У него 3 отличия от match :

  1. Он возвращает не массив, а перебираемый объект с результатами, обычный массив можно сделать при помощи Array.from .
  2. Каждое совпадение возвращается в виде массива со скобочными группами (как str.match без флага g ).
  3. Если совпадений нет, то возвращается не null , а пустой перебираемый объект.

При переборе результатов matchAll в цикле for..of вызов Array.from , разумеется, не нужен.

str.split(regexp|substr, limit)

Разбивает строку в массив по разделителю – регулярному выражению regexp или подстроке substr.

Обычно мы используем метод split со строками, вот так:

Но мы можем разделить по регулярному выражению аналогичным образом:

Читать еще:  Javascript справочник функций

str.search(regexp)

Метод str.search(regexp) возвращает позицию первого совпадения с regexp в строке str или -1 , если совпадения нет.

Важное ограничение: str.search умеет возвращать только позицию первого совпадения.

Если нужны позиции других совпадений, то следует использовать другой метод, например, найти их все при помощи str.matchAll(regexp) .

str.replace(str|regexp, str|func)

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

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

Хотя есть подводный камень.

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

Вы можете видеть это в приведённом выше примере: только первый «-» заменяется на «:» .

Чтобы найти все дефисы, нам нужно использовать не строку «-» , а регулярное выражение /-/g с обязательным флагом g :

Второй аргумент – строка замены. Мы можем использовать специальные символы в нем:

Для ситуаций, которые требуют «умных» замен, вторым аргументом может быть функция.

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

Функция вызывается с аргументами func(match, p1, p2, . pn, offset, input, groups) :

  1. match – найденное совпадение,
  2. p1, p2, . pn – содержимое скобок (см. главу Скобочные группы).
  3. offset – позиция, на которой найдено совпадение,
  4. input – исходная строка,
  5. groups – объект с содержимым именованных скобок (см. главу Скобочные группы).

Если скобок в регулярном выражении нет, то будет только 3 аргумента: func(match, offset, input) .

Например, переведём выбранные совпадения в верхний регистр:

Заменим каждое совпадение на его позицию в строке:

В примере ниже двое скобок, поэтому функция замены вызывается с 5-ю аргументами: первый – всё совпадение, затем два аргумента содержимое скобок, затем (в примере не используются) индекс совпадения и исходная строка:

Если в регулярном выражении много скобочных групп, то бывает удобно использовать остаточные аргументы для обращения к ним:

Или, если мы используем именованные группы, то объект groups с ними всегда идёт последним, так что можно получить его так:

Использование функции даёт нам максимальные возможности по замене, потому что функция получает всю информацию о совпадении, имеет доступ к внешним переменным и может делать всё, что угодно.

regexp.exec(str)

Метод regexp.exec(str) ищет совпадение с regexp в строке str . В отличие от предыдущих методов, вызывается на регулярном выражении, а не на строке.

Он ведёт себя по-разному в зависимости от того, имеет ли регулярное выражение флаг g .

Если нет g , то regexp.exec(str) возвращает первое совпадение в точности как str.match(regexp) . Такое поведение не даёт нам ничего нового.

Но если есть g , то:

  • Вызов regexp.exec(str) возвращает первое совпадение и запоминает позицию после него в свойстве regexp.lastIndex .
  • Следующий такой вызов начинает поиск с позиции regexp.lastIndex , возвращает следующее совпадение и запоминает позицию после него в regexp.lastIndex .
  • …И так далее.
  • Если совпадений больше нет, то regexp.exec возвращает null , а для regexp.lastIndex устанавливается значение 0 .

Таким образом, повторные вызовы возвращают одно за другим все совпадения, используя свойство regexp.lastIndex для отслеживания текущей позиции поиска.

В прошлом, до появления метода str.matchAll в JavaScript, вызов regexp.exec в цикле использовали для получения всех совпадений с их позициями и группами скобок в цикле:

Это работает и сейчас, хотя для современных браузеров str.matchAll , как правило, удобнее.

Мы можем использовать regexp.exec для поиска совпадения, начиная с нужной позиции, если вручную поставим lastIndex .

Если у регулярного выражения стоит флаг y , то поиск будет вестись не начиная с позиции regexp.lastIndex , а только на этой позиции (не далее в тексте).

В примере выше заменим флаг g на y . Ничего найдено не будет, поскольку именно на позиции 5 слова нет:

Это удобно в тех ситуациях, когда мы хотим «прочитать» что-то из строки по регулярному выражению именно на конкретной позиции, а не где-то далее.

Руководство по Java. Регулярные выражения Java.

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

Регулярные выражения в Java обеспечиваются пакетом java.util.regex.

В пакете java.util.regex ключевыми являются 3 класса:

  • Matcher
    Этот клсс интерпретирует шаблон и предоставляет определяет совпадения в водимой строке.
  • Pattern
    Класс Pattern предоставляет нам скомпилированный вариант регулярного выражения.
  • PatternSyntaxException
    Этот класс предоставляет нам непроверяемые исключения, которые указывают нам на синтаксическую ошибку в нашем регулярном выражении.

Схватывающая группа

Схватывающая группа – это способ представить несколько символов, как единый элемент. Они создаются путём размещения символов внутри множества скобок. Например, слово (car) создаёт единую группу, которая состоит из букв “c”, “a” и “r”.

Для того, чтобы понять, как это применяется на практике, рассмотрим пример простого приложения.

В результате работы программы мы получим такой результат:

Здесь приведён крайне примитывный способ найти номер телефона в строке. На практике, для такой операции понадобиться более сложный шаблон, но в качестве примера нас устроит и такой вариант.

Как мы видим, мы применяем регулярное выражение d, которое выводит числа (от 0 до 9). В результате программа опускает все нечисловые символы в строке и возвращает нам только номер телефона.

Читать еще:  Sortedset java пример

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

Методы класса Matcher

В классе Matcher есть ряд методов, для определения места совпадения.

  • public int start()
    Возвращает начальный индекс предыдущего совпадения.
  • public int start(int group)
    Возвращает начальный идндекс подстроки, захваченной данной группой во время предыдущего совпадения.
  • public int end()
    Возвращает смещение после крайнего совпадающего символа.
  • public int end(int group)
    Возвращает смещение после крайнего символа подстроки, захваченного данной группой во время крайнего совпадения.

Методы поиска

Методы поиска предназначены для того, чтобы узнать есть ли в водимй строке указанный шаблон (pattern).

Вот список методов поиска:

  • public boolean lookingAt()
    Ищет совпадения вводной строки и шаблона.
  • public boolean find()
    Ищет подстроку вводной строки, которая совпадает с шаблоном.
  • public boolean find(int start)
    Ищет подстроку вводной строки, которая совпадает с шаблоном начиная с указанного индекса.
  • public boolean matches()
    Ищет совпадения всей строки и шаблона.

Методы замещения

Для замещения текста в вводной строке в языке Java предусмотрены следующие методы:

  • public Matcher appendReplacement(StringBuffer sb, String replacement)
    Метод реализует объединение и замену строки.
  • public StringBuffer appendTail(StringBuffer sb)
    Метод реализует объединение и замену строки.
  • public String replaceAll(String replacement)
    Заменяет все подстроки вводной строки, которая совпадает с шаблоном, указанным в вводной строке.
  • public String replaceFirst(String replacement)
    Заменяет первую подстроку вводной строки, которая совпадает с шаблоном.
  • public static String quoteReplacement(String s)
    Этот метод возвращает литералбную замену стоки для указанной строки.

Для понимания того, как все эти методы работают на практике, рассмотрим примеры простых приложений.

Метод find()

В результате работы программы мы получим следующий результат:

Метод lookingAt()
Пример:

В результате работы программы мы получим следующий результат:

Метод replaceAll()
Пример:

В результате работы программы мы получим следующий результат:

Метод appendReplacement()
Пример:

В результате работы программы мы получим следующий результат:

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

В следующем уроке мы более глубоко изучим, что такое методы и как они работают в языке программирования Java.

Регулярные выражения java

В продолжение статьи Строки в Java: String, StringBuilder, StringBuffer поговорим сегодня о регулярных выражениях:

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

Регулярные выражения — это инструмент который задает шаблон для строк. Если у программиста стоит задача обработать большой набор строк и отыскать в нем нужную или проверить соответствует ли входящая строка определенному правилу — регулярные выражения появляются очень к стати.

Регулярные выражения в Java

В Java есть пакет java.util.regex, который позволяет работать с регулярными выражениями. В нем есть интерфейс MatchResult — результат операции сравнения, классы Matcher — механизм, который выполняет операции сопоставления последовательности символов путем интерпретации шаблона и Pattern — скомпилированное представление регулярного выражения.

У класса Pattern есть метод compile(), который возвращает Pattern, соответствующий регулярному выражению. Метод matches — сравнивает выражение с набором символов и возвращает true, false в зависимости от того совпали строки или нет.

Например проверка пароля, которую мы делали через метод equals может быть реализована более элегантно с помощью метода matches.

А как насчет проверить состоит ли строка только с цифр? С помощью вышеупомянутого метода сделать это легко.

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

Метод matches также есть и у класса String. Программа выше будет работать корректно если заменить строку Pattern.matches(«[0-9]+», string) на string.matches(«[0-9]+»). Попробуйте поэкспериментировать.

[0-9]+ и есть регулярное выражение. Оно означает, что принимаются только символы от 0 до 9, а знак + означает, что их может быть один или несколько.

Правила написания регулярных выражений

Примеры выше показали как мощны и удобны regex-пы. Для того, чтобы писать любые условия соответствия строки нужно знать правила их написания.

Их не много и они очень просты и интуитивно понятны.

  1. . — точка это соответствие любому символу
  2. ^строка — находит регулярное выражение, которое должно совпадать в начале строки
  3. строка$ — выражение, которое должно совпадать в конце строки
  4. [абв] — только буквы а или б или в
  5. [абв][яю] — только буквы а или б или в за которыми следуют я или ю
  6. [^abc] — когда символ каретки появляется в качестве первого символа в квадратных скобках, он отрицает шаблон. Этот шаблон соответствует любому символу, кроме a или b или c.

Следующие метасимволы имеют предопределенное значение и упрощают использование некоторых общих шаблонов.

  1. d — любая цифра — равнозначно [0-9]
  2. D — только не цифра — равнозначно [^0-9]
  3. s — символ пробела
  4. w — символ слова — равнозначно [a-zA-Z_0-9]

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

  1. * — символ звездочки означает от ноля до бесконечности
  2. + — символ может встречаться от одного или несколько раз, сокращенно
  3. ? — встречается ни разу или один раз, знак вопроса это сокращение для
  4. — символ встречается X раз
  5. — символ встречается от X до Y раз.

Теперь очередь примеров.

Использование регулярных выражений

Regex можно использовать не только с методом matches. Некоторые методы класса String принимают регулярные выражения как параметр.

Регулярные выражения очень часто используют при валидации вводимых полей пользователями. Например, вы хотите, чтобы пароль пользователей был не меньше, чем 8 символов и мог содержать как буквы, так и цифры.

Это все, что касается регулярных выражений в языке программирования java. По крайней мере, больше я не использую в своей практике. Для программирования, а тем более для новичков этого будет вполне достаточно.

Регулярные выражения в Java

Регулярные выражения или Regex (вкратце) — это API для определения шаблонов String, которые можно использовать для поиска, управления и редактирования строки в Java. Проверка электронной почты и пароли — это несколько областей строк, где Regex широко используется для определения ограничений. Регулярные выражения предоставляются в пакете java.util.regex. Он состоит из 3 классов и 1 интерфейса.


Пакет java.util.regex в основном состоит из следующих трех классов:

Интерфейс MatchResult: этот интерфейс используется для определения результата операции сопоставления для регулярного выражения. Следует отметить, что хотя границы соответствия, группы и границы групп можно увидеть, модификация через MatchResult не допускается.

    Класс java.util.regex.Pattern: Этот класс представляет собой компиляцию регулярных выражений, которые могут использоваться для определения различных типов скороговорок, не предоставляя открытых конструкторов. Это можно создать, вызвав метод compile (), который принимает регулярное выражение в качестве первого аргумента и, таким образом, возвращает шаблон после выполнения.

// Простая Java-программа для демонстрации работы
// Pattern.matches () в Java

public static void main(String args[])

// Следующая строка выводит «true», потому что все

// текст «geeksforgeeks» соответствует шаблону «geeksforge * ks»

System.out.println (Pattern.matches( «geeksforge*ks» ,

// Следующая строка печатает «ложь», потому что весь

// текст «geeksfor» не соответствует шаблону «g * geeks *»

System.out.println (Pattern.matches( «g*geeks*» ,

java.util.regex.Matcher class: этот объект используется для выполнения операций сопоставления для входной строки в java, таким образом интерпретируя ранее объясненные шаблоны. Это также не определяет общедоступных конструкторов. Это может быть реализовано путем вызова matcher () для любого объекта шаблона.

Обратите внимание, что Pattern.matches () проверяет, соответствует ли весь текст шаблону или нет. Другие методы (показанные ниже) в основном используются для поиска многократных вхождений паттерна в тексте.

Java-программы для демонстрации работы compile (), find (), start (), end () и split ():

    Java-программа для демонстрации простого поиска по шаблону

// Простая Java-программа для демонстрации работы
// Соответствие строк в Java

public static void main(String args[])

// Создать шаблон для поиска

Pattern pattern = Pattern.compile( «geeks» );

// Поиск над шаблоном в «geeksforgeeks.org»

Matcher m = pattern.matcher( «geeksforgeeks.org» );

// Печать начальных и конечных индексов шаблона

System.out.println( «Pattern found from » + m.start() +

Java-программа для демонстрации простого поиска по регулярным выражениям

// Простая Java-программа для демонстрации работы
// Соответствие строк в Java

public static void main(String args[])

// Создать шаблон для поиска

Pattern pattern = Pattern.compile( «ge*» );

// Поиск над шаблоном в «geeksforgeeks.org»

Matcher m = pattern.matcher( «geeksforgeeks.org» );

// Печать начальных и конечных индексов шаблона

System.out.println( «Pattern found from » + m.start() +

Java-программа для демонстрации поиска без учета регистра

// Простая Java-программа для демонстрации работы
// Соответствие строк в Java

public static void main(String args[])

// Создать шаблон для поиска

Pattern.compile( «ge*» , Pattern.CASE_INSENSITIVE);

// Поиск над шаблоном в «geeksforgeeks.org»

Matcher m = pattern.matcher( «GeeksforGeeks.org» );

// Печать начальных и конечных индексов шаблона

System.out.println( «Pattern found from » + m.start() +

Java-программа для демонстрации работы split () для разделения текста на основе шаблона разделителя

// Java-программа для демонстрации работы разделения текста по
// данный шаблон

public static void main(String args[])

String text = «geeks1for2geeks3» ;

// Определяет строковый шаблон для поиска

String delimiter = «\d» ;

Pattern pattern = Pattern.compile(delimiter,

// Используется для поиска строки без учета регистра

String[] result = pattern.split(text);

for (String temp: result)

Класс PatternSyntaxException: этот объект Regex используется для обозначения синтаксической ошибки в шаблоне регулярного выражения и является непроверенным исключением.

Важные наблюдения / факты:

  1. Мы создаем объект шаблона, вызывая Pattern.compile (), конструктора нет. compile () является статическим методом в классе Pattern.
  2. Как и выше, мы создаем объект Matcher, используя matcher () для объектов класса Pattern.
  3. Pattern.matches () также является статическим методом, который используется для проверки, соответствует ли данный текст в целом шаблону или нет.
  4. find () используется для поиска нескольких вхождений шаблона в тексте.
  5. Мы можем разделить текст на основе шаблона разделителя
    используя split ()

Статьи на основе регулярных выражений Java:

Эта статья предоставлена Akash Ojha . Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью и отправить ее по почте на contrib@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

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

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector
×
×