Регулярное выражение – та же группа позже

(Это в Java) Я пытаюсь сопоставить эту строку

"aaaBaaa"

используя это регулярное выражение Java

(a+)B\1

Предполагается, что \1 означает первую группу (часть шаблона a+)

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


Обновлено:

Это задача:

Returns true if for every '*' (star) in the string, if there are chars both immediately before and after the star, they are the same.


sameStarChar("xy*yzz") → true
sameStarChar("xy*zzz") → false
sameStarChar("*xa*az") → true

И вот как я пытаюсь это решить:

public boolean sameStarChar(String str) {
  java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("[*]|(.)([*])\1");
  java.util.regex.Matcher matcher = pattern.matcher(str);
  return matcher.find();
}

У меня работает: ruular.com/r/v3vx1ABIyGdSXS Что вы подразумеваете под «не работает»? Как вы используете регулярное выражение? Пожалуйста, покажите свой код.

Bohemian 24.06.2024 11:21

Поддержка определенных функций регулярных выражений зависит от реализации. На каком языке вы используете регулярное выражение?

Randommm 24.06.2024 11:23

Зачем *xa*az возвращать true то, что первому * ничего не предшествовало?

Hao Wu 24.06.2024 11:32
\1 — недопустимая escape-последовательность в строке. Вы должны избегать самой обратной косой черты, чтобы ее мог видеть анализатор регулярных выражений: "[*]|(.)([*])\\1".
knittl 24.06.2024 11:41

@Hoa, обратите внимание, что в задании говорится: «Есть ли символы непосредственно перед звездой и после нее». Это означает, что не существует ограничения равенства, если это не так.

trincot 24.06.2024 11:45

И это одна из причин, по которой тег regex предлагает вам указать язык.

Biffen 24.06.2024 11:45

Задача звучит как ([^*])\*\1 (так как строка Java удваивает обратную косую черту)

bobble bubble 24.06.2024 11:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

    public boolean sameStarChar(String str) {
        Pattern pattern = Pattern.compile("(.)\\*(?!\\1).");
        Matcher matcher = pattern.matcher(str);
        return !matcher.find();
    }

Таким образом, функция также вернет true, если на входных данных вообще нет звездочки или есть только одна звездочка в самом начале или в самом конце ввода.

Другие вопросы по теме

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

Список итераций Java внутри списка
Асинхронные методы выдают сообщение «Реализация JAXB-API не найдена в пути к модулю или пути к классам»
Пользовательский плагин Maven: как обрабатывать FileSet?
Почему мы используем новый оператор для доступа к вложенному статическому классу в Java?
Почему полученные сообщения не отображаются в пользовательском интерфейсе?
Плагин [id: 'kotlin-android', версия: '1.7.10'] не был найден ни в одном из следующих источников в Android Studio для Flutter
Как программно установить в Jetty 12 максимальный размер запроса?
Не удалось найти валидатор для ограничения «jakarta.validation.constraints.Pattern» — ошибка все еще появляется даже после удаления валидатора из класса
Свойство цвета строки состояния Android не применяется к действиям, выполненным из предустановки действий «Пустые представления»
Область столбца-заполнителя полосы прокрутки в стиле TableView