Elettracompany.com

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

Java matcher group

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

Пакет java.util.regex предоставляется Java с целью сопоставления регулярных выражений с шаблоном. Регулярные выражения Java характеризуются существенным сходством с языком программирования Perl и очень просты в освоении.

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

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

  • Pattern Class – объект класса Pattern представляет скомпилированное представление регулярного выражения. В классе Pattern публичный конструктор не предусмотрен. Для создания шаблона, вам сперва необходимо вызвать один из представленных публичных статичных методов compile(), который далее произведет возврат объекта класса Pattern. Регулярное выражение в данных методах принимается как первый аргумент.
  • Matcher Class – объект класса Matcher представляет механизм, который интерпретирует шаблон, а также производит операции сопоставления с вводимой строкой. Аналогично классу Pattern, Matcher не содержит публичных конструкторов. Объект класса Matcher может быть получен путем вызова метода matcher() на объекте класса Pattern.
  • PatternSyntaxException – объект класса PatternSyntaxException представляет непроверяемое исключение, которое обозначает синтаксическую ошибку в шаблоне регулярного выражения.

Содержание

Группы сбора

Группы сбора представляют способ обращения с несколькими символами как с одной единицей. Они создаются путем размещения символов, которые предстоит сгруппировать, в серии круглых скобок. К примеру, регулярное выражение (dog) составляет отдельную группу, содержащую буквы «d», «o», и «g».

Группы сбора нумеруются посредством определения числа открывающих круглых скобок слева направо. Так, в выражении ((A)(B(C))) присутствуют четыре подобные группы:

Для определения числа групп, представленных в выражении, вызвать метод groupCount на объекте класса matcher в Java. Метод groupCount извлекает число типа int, отображающее количество групп сбора, представленных в сопоставляемом шаблоне.

Также имеется специальная группа, группа 0, которая во всех случаях представляет выражение в полном виде. Данная группа не включается в сумму, представленную методом groupCount.

Пример

Ниже рассмотрен пример регулярного выражения в Java, иллюстрирующий способ выявления строки цифр в представленных буквенно-цифровых строках.

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

Синтаксис регулярных выражений

В Java регулярные выражения используют специальные символы. В следующей таблице представлены метасимволы доступные в синтаксисе регулярных выражений.

Руководство по 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)
    Возвращает смещение после крайнего символа подстроки, захваченного данной группой во время крайнего совпадения.
Читать еще:  Подключаемый модуль java

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

Методы поиска предназначены для того, чтобы узнать есть ли в водимй строке указанный шаблон (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 Matcher: понимание разницы между» (?: X / Y) «и» (?: X) / (?:Год)»

может кто-нибудь объяснить:

  1. почему две модели, используемые ниже, дают разные результаты? (ответ ниже)
  2. почему 2-й пример дает количество групп 1, но говорит о начале и конец группы 1 и -1?

который дает следующий вывод:

4 ответов

1) Обе модели дают разные результаты из-за правил приоритета операторов.

  • (?:Yes|No)(.*)End матчи (да или Нет).* End
  • (?:Yes)|(?:No)(.*)End матчи (да) или (нет .* End)

2) второй шаблон дает количество групп 1, но начало и конец -1 из-за (не обязательно интуитивных) значений результатов, возвращаемых Matcher способ звонки.

  • Matcher.find() возвращает true, если найдено совпадение. В вашем случае матч был на (?:Yes) часть рисунка.
  • Matcher.groupCount() возвращает количество групп захвата в шаблоне независимо от того, действительно ли группы захвата участвовали в матче. В вашем случае только non capturing (?:Yes) часть шаблона участвовала в матче, но захват (.*) группа все еще была частью шаблона, поэтому количество групп это 1.
  • Matcher.start(n) и Matcher.end(n) верните начальный и конечный индексы подпоследовательности, соответствующие n — й группы захвата. В вашем случае, хотя общий матч был найден, (.*) группа захвата не участвовала в матче и поэтому не захватила подпоследовательность, следовательно, результаты -1.

3) (вопрос задан в комментарии.) Чтобы определить, сколько групп захвата фактически захватили подпоследовательность, повторите Matcher.start(n) от 0 до Matcher.groupCount() подсчет числа номера -1 результаты. (Обратите внимание, что Matcher.start(0) — это группа захвата, представляющая весь шаблон, который вы можете исключить для своих целей.)

разница в том, что во втором шаблоне «(?:Yes)|(?:No)(.*)End» , конкатенация («X с последующим Y «в» XY») имеет более высокий приоритет чем выбор («или X или Y» в «X / Y»), как умножение имеет более высокий приоритет, чем сложение, поэтому шаблон эквивалентен

то, что вы хотели получить, это следующий шаблон:

это дает тот же результат, что и ваш первый шаблон.

в вашем тесте, второй шаблон имеет группу 1 в (пустом) диапазоне [-1, -1[ потому что эта группа не совпадала (начало -1 включено, конец -1 исключен, что делает полуоткрытый интервал пустой).

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

Читать еще:  Отсортировать arraylist java

количество групп, как возвращается Matcher.groupCount() , получается чисто путем подсчета скобок группировки захвата группы, независимо от того, может ли любой из них совпадать с любым заданным входом. Ваш шаблон имеет ровно одну группу захвата: (.*) . Это группа 1. The документации:

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

соответствует ли какая-либо конкретная группа заданному входу, не имеет значения для этого определения. Е. Г., в шаблоне (Yes)|(No) , есть две группы ( (Yes) группа 1, (No) группа 2), но только один из них может сравниться в любой момент вход.

вызов Matcher.find() возвращает true, если регулярное выражение совпадает в некоторой подстроки. Вы можете определить, какие группы совпадают, посмотрев на их начало: Если это -1, то группа не совпадала. В этом случае конец также равен -1. Нет встроенного метода, который говорит вам, сколько групп захвата фактически совпало после вызова find() или match() . Вы должны были бы пересчитать их сами, глядя на каждую группу начать.

когда дело доходит до backreferences, также обратите внимание, что учебник по регулярному выражению говорит:

существует разница между backreference для группа захвата, которая не соответствовала ничему, и один к группа захвата, которая вообще не участвовала в матче.

Java matcher group

addShutdownHook , any , any , asBoolean , asType , average , collect , collect , collect , contains , count , dump , each , eachWithIndex , equals , every , every , find , find , findAll , findAll , findIndexOf , findIndexOf , findIndexValues , findIndexValues , findLastIndexOf , findLastIndexOf , findResult , findResult , flatten , getAt , getMetaClass , getMetaPropertyValues , getProperties , grep , grep , groupBy , groupBy , hasProperty , identity , inject , inject , inspect , invokeMethod , is , isCase , iterator , join , metaClass , print , print , printf , printf , println , println , println , putAt , respondsTo , respondsTo , setMetaClass , size , split , sprintf , sprintf , stream , sum , sum , tap , toArrayString , toSpreadMap , toString , use , use , use , with , with , withTraits

Methods Detail

public boolean asBoolean()

Coerce a Matcher instance to a boolean value.

Returns: the boolean value Since: 1.7.0

    public Object getAt(int idx)

    Support the subscript operator, e.g. matcher[index], for a regex Matcher.

    For an example using no group match,

    For an example using group matches,

    For another example using group matches,

    Parameters: idx — an index Returns: object a matched String if no groups matched, list of matched groups otherwise. Since: 1.0

    public List getAt(Collection indices)

    Select a List of values from a Matcher using a Collection to identify the indices to be selected.

    Parameters: indices — a Collection of indices Returns: a String of the values at the given indices Since: 1.6.0

    public int getCount()

    Find the number of Strings matched to the given Matcher.

    Returns: int the number of Strings matched to the given matcher. Since: 1.0

    public static Matcher getLastMatcher()

    Get the last hidden matcher that the system used to do a match.

    Returns: the last regex matcher Since: 1.0

    public boolean hasGroup()

    Check whether a Matcher contains a group or not.

    Returns: boolean true if matcher contains at least one group. Since: 1.0

    public Iterator iterator()

    Returns an Iterator which traverses each match.

    Returns: an Iterator for a Matcher Since: 1.0 See Also:Matcher#group()

    public boolean matchesPartially()

    Given a matcher that matches a string against a pattern, this method returns true when the string matches the pattern or if a longer string, could match the pattern. For example:

    Returns: true if more input to the String could make the matcher match the associated pattern, false otherwise. Since: 2.0.0

    public void setIndex(int idx)

    Set the position of the given Matcher to the given index.

    Parameters: idx — the index number Since: 1.0

    public long size()

    Provide the standard Groovy size() method for Matcher .

    Returns: the matcher’s size (count) Since: 1.5.0

Java — паттерны — Matcher.group()?

Итак, у меня есть документ и указанная N-граммовая целевая строка. Я пытаюсь найти индексы всех вхождений целевой строки.

Итак, строка «the lazy dog, jumps, the lazy dog.»

Допустим, мой целевой n-грамм равен «the lazy». Я по существу ‘iterate’ через всю строку следующим образом, добавив ‘n’ слова в связанный список, currentNGram. Если все слова в currentNGram соответствуют целевому n-грамму, я сохраняю индекс. В противном случае я удаляю первый элемент связанного списка и добавляю следующее слово во входную строку (например. проверьте следующий последовательный n-грамм в документе).

Так что все это прекрасно и денди, но моя следующая проблема заключается в том, что я должен ‘iterate’ снова просмотреть документ и найти расстояние каждого n-грамма до ближайшего целевого n-грамма. Поэтому я придерживаюсь точно такого же подхода. Кроме этого времени, когда я повторно инициализирую сопоставитель и выполняю цикл следующим образом,

он печатает слово «the» 7 раз вместо печати «the» «lazy» «dog» «jumps» и т. д. Однако,

А почему это так? Почему в первой задаче вызов метода matcher.group() выводит слова в правильном порядке, а во второй-нет? Любое направление было бы очень ценно; я знаю, что это был длинный пост, извините.

1 Ответ

Во-первых, некоторые базовые знания. Давайте посмотрим, что делает Matcher.find .

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

Далее, давайте взглянем на Matcher.group

Возвращает входную подпоследовательность, совпадающую с предыдущим соответствием.

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

Вы печатаете currentGram.printLast несколько раз за matcher.find звонок-если быть точным, то lengthOfTargetNTuple раза. currentGram.printLast должно быть результатом того, что было только что добавлено — matcher.group().toLowerCase() . Поскольку мы вызвали matcher.find только один раз для всего цикла, это значение не изменится.

Однако здесь вы печатаете matcher.group только один раз за вызов match.find . Это означает, что вы печатаете каждую подобранную подпоследовательность только один раз, а не lengthOfTargetNTuple раз.

Похожие вопросы:

У меня есть код, который находит координаты между конкретными словами. Теперь вывод на консоль работает идеально, но id хотел бы вывести найденные совпадения в файл Мой текущий код: public class.

Я пытаюсь скомпилировать следующий цикл while, но я продолжаю получать красный флаг в eclipse рядом с group.matcher(. ), который говорит, чтобы удалить аргумент, чтобы я соответствовал группе.

Я конвертирую приложение Java 7 в приложение Java 6. Я застрял на свойстве matcher.group , так как я действительно не понимаю, что он делает. У меня есть следующий код: public static final String.

При попытке получить matcher.group() в виде строки он говорит, что он недоступен. Почему? CODE: private static ArrayList validateList(List listToProcess) <.

Следующий код дает исключение при первом запуске. Но когда я устанавливаю точку останова на строке matcher и оцениваю несколько команд в Netbeans Watcher. Это работает. Почему?? String regex =.

Я ниже код и в котором я пытаюсь напечатать все совпадения в строке с помощью Matcher.group() . public static void main(String[] args) < String s = foornbarrnfoo + foo, barrnak = + foo.

[Публикация этого вопроса поскольку я не смог найти ни одного вопроса, соответствующего моему сценарию, пожалуйста, укажите мне на пост, если это уже обсуждается, я удалю этот пост. ] Попытка.

Я пытаюсь выполнить ping и взять сводку ping, которая будет указана в Matcher.group(0). Итоговый результат пинга, который показан, является: Matcher.group(0) time=35ms time=3ms time=2ms time=3ms.

Я нуб для regex. У меня есть строка вроде:- 1.9% 2581/candaemon: 0.4% user + 1.4% kernel и я должен извлечь все паттерны, соответствующие этому типу % Например:- для данного str результат должен.

Ссылка на основную публикацию
Adblock
detector