Matcher не находит перекрывающиеся слова?

Я пытаюсь взять строку:

String s = "This is a String!";

И вернуть все пары из двух слов в этой строке. А именно:

{"this is", "is a", "a String"}

Но прямо сейчас все, что я могу сделать, это вернуть:

{"this is", "a String"}

Как я могу определить свой цикл while, чтобы я мог объяснить это отсутствие перекрывающихся слов? Мой код выглядит следующим образом: (На самом деле, я был бы счастлив, если бы он просто возвращал целое число, представляющее, сколько строковых подмножеств он нашел...)

int count = 0;
while(matcher.find()) {
    count += 1;
}

Спасибо всем.


person Shawn Taylor    schedule 18.09.2012    source источник
comment
Вы видели этот ТАК вопрос?   -  person Ray Toal    schedule 18.09.2012


Ответы (4)


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

Pattern pattern = Pattern.compile('\\S+ \\S+');
Matcher matcher = pattern.matcher(inputString);
int matchCount = 0;
boolean found = matcher.find();
while (found) {
  matchCount += 1;
  // search starting after the last match began
  found = matcher.find(matcher.start() + 1);
}

На самом деле вам нужно быть немного умнее, чем просто добавить 1, поскольку попытка этого на «силе» будет соответствовать «силе», а затем «силе». Конечно, это излишне для подсчета слов, но это может оказаться полезным, если регулярное выражение более сложное.

person Jeff Bowman    schedule 18.09.2012

Запустите цикл for от i = 0 до количества слов - 2, тогда слова i и i+1 составят одну строку из двух слов.

String[] splitString = string.split(" ");
for(int i = 0; i < splitString.length - 1; i++) {
    System.out.println(splitString[i] + " " + splitString[i+1]);
}

Количество строк из двух слов в предложении равно количеству слов минус один.

int numOfWords = string.split(" ").length - 1;
person Jonathon Ashworth    schedule 18.09.2012

Общее количество пар = Общее количество слов - 1

И вы уже знаете, как считать общее количество слов.

person Subir Kumar Sao    schedule 18.09.2012

Я пробовал с группой шаблонов.

String s = "this is a String";

Pattern pat = Pattern.compile("([^ ]+)( )([^ ]+)");
Matcher mat = pat.matcher(s);
boolean check = mat.find();
while(check){
    System.out.println(mat.group());
    check = matPOS.find(mat.start(3));
}

из выкройки ([^ ]+)( )([^ ]+)
..........................|_______________|
.......... .................группа(0)
................... .......|([^ ]+)| ‹--group(1)
......................................|( ) | ‹--группа(2)
........................................ ....|([^ ]+)| ‹--группа(3)

person khusnanadia    schedule 04.04.2016