#java #regex #algorithm
Вопрос:
Я пытаюсь написать программу, которая принимает любые два числа и проверяет, соответствуют ли они заданному шаблону:
абб абб абб абб абб абб абб абб абб абб абб абб абб абб абб абб абб абб абб
Я поставил пробелы, чтобы сделать это более понятным. Как вы можете видеть, это следует шаблону, в котором каждый раз, когда за » abb «следует » abbb», количество раз, когда «abbb» встречается на каждой итерации, увеличивается на 1. Так что это что-то вроде этого:
В каждой итерации: abb(abbb )
Я пытаюсь понять, как это сделать, используя библиотеку шаблонов на Java, но пока не нашел никакого решения.
Комментарии:
1. Каковы входные и ожидаемые выходные данные?
2. Ввод-это любая строка, которую необходимо проверить, соответствует ли она заданному шаблону или нет. Вывод представляет собой логическое значение, которое указывает, следует ли оно заданному шаблону или нет. Мне дали это в тесте на профпригодность, я попытался решить сам, но не смог сделать это с помощью класса pattern в Java. Я все еще ищу, как это можно было бы сделать.
3. @user47 если я не ошибаюсь, ваш шаблон-abb(abbb)
4. Вы можете использовать регулярное выражение для сопоставления, добавьте регулярное выражение тега в свой вопрос
5. Одно регулярное выражение не может этого сделать. Вам также придется написать код, чтобы проверить, правильно ли растут совпадающие термины
Ответ №1:
Вы можете использовать регулярные выражения в java, подробнее читайте об API регулярных выражений в java
import java.util.regex.Pattern;
System.out.println (Pattern.matches("abb(abbb) ","abbabbb"));
Ответ №2:
Я понимаю, что сумма abbb
увеличивается каждый раз abb
, когда выполняется.
Затем подтвердите с помощью
^((abb|1)abbb) $
См.Доказательство регулярного выражения.
Java-код:
yourString.matches("((abb|\1)abbb) ")
объяснение
--------------------------------------------------------------------------------
^ the beginning of the string
--------------------------------------------------------------------------------
( group and capture to 1 (1 or more times
(matching the most amount possible)):
--------------------------------------------------------------------------------
( group and capture to 2:
--------------------------------------------------------------------------------
abb 'abb'
--------------------------------------------------------------------------------
| OR
--------------------------------------------------------------------------------
1 what was matched by capture 1
--------------------------------------------------------------------------------
) end of 2
--------------------------------------------------------------------------------
abbb 'abbb'
--------------------------------------------------------------------------------
) end of 1 (NOTE: because you are using a
quantifier on this capture, only the LAST
repetition of the captured pattern will be
stored in 1)
--------------------------------------------------------------------------------
$ before an optional n, and the end of the
string
Если вы хотели извлечь, используйте
abb(?:abbb)
Смотрите это доказательство регулярного выражения.
объяснение
--------------------------------------------------------------------------------
abb 'abb'
--------------------------------------------------------------------------------
(?: group, but do not capture (1 or more times
(matching the most amount possible)):
--------------------------------------------------------------------------------
abbb 'abbb'
--------------------------------------------------------------------------------
) end of grouping
Java-код:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "abb(?:abbb) ";
final String string = "abbabbbnabbabbbabbabbbabbbnabbabbbabbabbbabbbabbabbbabbbabbbabbnabbabbbabbabbbabbbn";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(0));
}
}
}