codingBat plusOut с использованием регулярных выражений - PullRequest
2 голосов
/ 13 апреля 2010

Это похоже на мои предыдущие попытки (wordEnds и repeatEnd): в качестве умственного упражнения я хочу решить эту проблему с помощью только регулярных выражений.

Описание от codingbat.com :

Если задана строка и непустая строка слова, верните версию исходной строки, в которой все символы заменены на плюсы ("+"), за исключением появления строки слова, которая сохраняется без изменений.

plusOut("12xy34", "xy") → "++xy++"
plusOut("12xy34", "1") → "1+++++"
plusOut("12xy34xyabcxy", "xy") → "++xy++xy+++xy"

Нет упоминания о том, разрешать или нет перекрытие (например, что такое plusOut("+xAxAx+", "xAx")?), Но мое решение без регулярных выражений не обрабатывает перекрытие, и оно проходит, поэтому я предполагаю, что мы можем предположить не перекрывающиеся вхождения word, если это упрощает (бонусные баллы, если вы предлагаете решения для обоих вариантов!).

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

Итак, давайте посмотрим, что придумает сообщество stackoverflow.

Ответы [ 4 ]

2 голосов
/ 13 апреля 2010

Это проходит все их тесты:

public String plusOut(String str, String word) {
  return str.replaceAll(
    String.format("(?<!(?=\\Q%s\\E).{0,%d}).", word, word.length()-1),
    "+"
  );  
}

Кроме того, я получаю:

plusOut("1xAxAx2", "xAx") → "+xAxAx+"

Если это результат, который вы искали, то я также прошу ваш тест на перекрытие, ноЯ должен признать, что это случайно.: D

0 голосов
/ 07 ноября 2014

Чрезвычайно простое решение, использующее \G:

word = java.util.regex.Pattern.quote(word);
return str.replaceAll("\\G((?:" + word + ")*+).", "$1+");

Однако есть оговорка .Вызов plusOut("12xxxxx34", "xxx") с вышеприведенной реализацией вернет ++xxx++++.

В любом случае, проблема не ясна с поведением в таком случае для начала.Для такой ситуации даже нет тестового примера (поскольку моя программа прошла все тестовые случаи).

Регулярное выражение в основном совпадает с решением для циклического анализа (которое также проходит все тестовые случаи):

StringBuilder out = new StringBuilder(str);

for (int i = 0; i < out.length(); ) {
    if (!str.startsWith(word, i))
        out.setCharAt(i++, '+');
    else
        i += word.length();
}

return out.toString();

Неоднократно пропускает word, затем заменяет текущий символ, если он не является префиксом word.

0 голосов
/ 29 апреля 2010

Это предоставлено здесь только для справки. По сути, это решение Алана, но вместо String.format.

используется replace.
public String plusOut(String str, String word) {
  return str.replaceAll(
    "(?<!(?=word).{0,M})."
      .replace("word", java.util.regex.Pattern.quote(word))
      .replace("M", String.valueOf(word.length()-1)),
    "+"
  );  
}
0 голосов
/ 13 апреля 2010

Я думаю, вы могли бы использовать отрицательный диапазон, чтобы сделать это.Поскольку это всего лишь подсказка, она не проверяется!

Превратите ваш "xy" в регулярное выражение, например: "[^xy]"

..., а затем оберните его в регулярное выражение, которое заменяетстроки, соответствующие этому выражению с помощью «+».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...