codingbat wordEnds, используя регулярные выражения

Я пытаюсь решитьwordEnds от codingbat.com используя регулярное выражение.

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

wordEnds("abcXY123XYijk", "XY") → "c13i"
wordEnds("XY123XY", "XY") → "13"
wordEnds("XY1XY", "XY") → "11"
wordEnds("XYXY", "XY") → "XY"

Это самое простое, как я могу сделать это с моими текущими знаниями о регулярных выражениях:

public String wordEnds(String str, String word) {
  return str.replaceAll(
     ".*?(?=word)(?<=(.|^))word(?=(.|$))|.+"
       .replace("word", java.util.regex.Pattern.quote(word)),
     " от codingbat.com2"
  );
}

replace используется для размещения в фактическомword строка в шаблон для удобочитаемости.Pattern.quote не обязательно проходить их тесты, но я думаю, что это требуется для правильного решения на основе регулярных выражений.

Регулярное выражение состоит из двух основных частей:

Если после сопоставления как можно меньше символов ".*?»,word все еще можно найти(?=word)«затем посмотрите назад, чтобы захватить любого предшествующего ему персонажа»(?<=(.|^))", матч "word"и с нетерпением жду, чтобы захватить любого персонажа, следующего за ним"(?=(.|$))».Первоначальный тест «если» гарантирует, что атомный взгляд захватывает только при наличииwordИспользование Lookahead для захвата следующего символа не потребляет его, поэтому его можно использовать как часть дальнейшего соответствияВ противном случае соответствует то, что осталось "|.+"Группы 1 и 2 будут захватывать пустые строки

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

Примечание: я не ищу решение, использующееindexOf и петля. Я хочу на основе регулярных выраженийreplaceAll решение. Мне также нужно рабочее регулярное выражение, которое проходит все тесты codingbat.

Мне удалось уменьшить возникновениеword в шаблоне только к одному.

".+?(?<=(^|.)word)(?=(.?))|.+"

Я все еще ищу, возможно ли еще упростить это, но у меня также есть другой вопрос:

С этой последней моделью я упростила.|$ чтобы просто.? успешно, но если бы я так же попытался упростить^|. в.? это не работает Это почему?

Ответы на вопрос(3)

Ваш ответ на вопрос