(Это в 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();
}
Поддержка определенных функций регулярных выражений зависит от реализации. На каком языке вы используете регулярное выражение?
Зачем *xa*az
возвращать true
то, что первому *
ничего не предшествовало?
\1
— недопустимая escape-последовательность в строке. Вы должны избегать самой обратной косой черты, чтобы ее мог видеть анализатор регулярных выражений: "[*]|(.)([*])\\1"
.
@Hoa, обратите внимание, что в задании говорится: «Есть ли символы непосредственно перед звездой и после нее». Это означает, что не существует ограничения равенства, если это не так.
И это одна из причин, по которой тег regex предлагает вам указать язык.
Задача звучит как ([^*])\*\1 (так как строка Java удваивает обратную косую черту)
Проблема в том, что в вашем регулярном выражении sameStarChar
первая альтернатива [*]
будет соответствовать, как только во входной строке появится звездочка. Даже если второй альтернативный шаблон потерпит неудачу, это не будет иметь значения.
Во-вторых, обратную косую черту необходимо экранировать, иначе анализатор регулярных выражений никогда ее не увидит.
Я бы предложил сопоставить противоположное, то есть строки, которые не соответствуют требованию, а затем вернуть логическое значение, противоположное этому.
Ввод завершается неудачно, если имеется звездочка, предшествующий символу и последующий символ которого различны. Так:
public boolean sameStarChar(String str) {
Pattern pattern = Pattern.compile("(.)\\*(?!\\1).");
Matcher matcher = pattern.matcher(str);
return !matcher.find();
}
Таким образом, функция также вернет true, если на входных данных вообще нет звездочки или есть только одна звездочка в самом начале или в самом конце ввода.
У меня работает: ruular.com/r/v3vx1ABIyGdSXS Что вы подразумеваете под «не работает»? Как вы используете регулярное выражение? Пожалуйста, покажите свой код.