Повторное использование потребляемых символов в сопоставлении с образцом в java?

119
19

Рассмотрим следующий шаблон: -

aba

И foll. строка источника: -

abababbbaba

01234567890 //Index Positions

Использование классов Pattern и Matcher из пакета java.util.regex находит этот шаблон только два раза, поскольку regex не рассматривает уже потребляемые символы.

Что делать, если я хочу повторно использовать часть уже потребляемых символов. То есть, я хочу 3 матча здесь, один в позиции 0, один на 2 (который игнорируется ранее) и один на 8.

Как мне это сделать??

спросил(а) 2021-01-25T20:46:36+03:00 4 месяца, 3 недели назад
1
Решение
99

Я думаю, вы можете использовать indexOf() для чего-то подобного.

String str = "abababbbaba";
String substr = "aba";
int location = 0;
while ((location = str.indexOf(substr, location)) >= 0)
{
System.out.println(location);
location++;
}

Печать:

0, 2 и 8

ответил(а) 2021-01-25T20:46:36+03:00 4 месяца, 3 недели назад
77

Вы можете использовать для этого взгляд вперед. Теперь у вас есть первая позиция в group(1) и второе совпадение в group(2). Оба делают каждую строку длиной 3 в предложении, которое вы ищете.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Question8968432 {
public static void main(String args[]) {
final String needle = "aba";
final String sentence = "abababbbaba";
final Matcher m = Pattern.compile("(.)(?=(..))").matcher(sentence);
while (m.find()) {
final String match = m.group(1) + m.group(2);
final String hint = String.format("%s[%s]%s",
sentence.substring(0, m.start()), match,
sentence.substring(m.start() + match.length()));
if (match.equals(needle)) {
System.out.printf("Found %s starting at %d: %s\n",
match, m.start(), hint);
}
}
}
}

Вывод:


Found aba starting at 0: [aba]babbbaba
Found aba starting at 2: ab[aba]bbbaba
Found aba starting at 8: abababbb[aba]

Вы можете пропустить final String hint часть final String hint, это просто, чтобы показать вам, что она соответствует и где.

ответил(а) 2021-01-25T20:46:36+03:00 4 месяца, 3 недели назад
45

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

a(?=ba)

ответил(а) 2021-01-25T20:46:36+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема