Java Regex Assistance - PullRequest
       14

Java Regex Assistance

0 голосов
/ 10 марта 2012

Эта проверка все еще не проходит.Я разделил условия, чтобы проверить их.Сбой для cs = "WWWW", "WXW", "WWWWWWWWRWWWWWW"

/** 
 * Check to ensure all lines are only composed of walls, 
 * entrance, exit, and space
 */
protected boolean invalidMazeCharacters(CharSequence cs) {

    p = Pattern.compile("^W+R|X|\\s*W+$");
    m = p.matcher(cs);
    if (!m.matches()) {
        return true;
    }
    return false;
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2012
CharSequence cs = new String(line.toString());

Здесь вы делаете строку того, как выглядит массив. Что-то вроде "[C @ 333cb1eb"

Удалите toString () на строке, и вы можете стать на шаг ближе.

1 голос
/ 10 марта 2012

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

^W[W{10,20}R{1}]W$

требует, чтобы строка была точнотри символа в длину;что первый символ будет W;что вторым символом будет W, {, 1, 0, запятая, 2, } или R;и что третий символ будет другим W.

В этом случае вы действительно должны написать:

^W+RW+$

, чтобы убедиться, что строка полностью состоит из Ws, кроме одного R, и что он начинается и заканчивается W s.(Вам не нужно беспокоиться о количестве W с, поскольку к этому моменту вы уже убедились, что длина строки ровно 22 символа.)


Отредактированодобавить: Кстати, замечательно, что у вас есть юнит-тесты, но у вашего метода такой узкий интерфейс - он принимает строку, выполняет кучу проверок и просто возвращает true или false -что это на самом деле не поддается юнит-тестированию.Если ваш модульный тест обнаружит, что метод ошибочно возвращает false для данной строки, у вас будет очень мало информации о том, что пошло не так, поэтому это не сильно поможет в обнаружении проблемы.(Вы уже видели это для себя.) Еще хуже, если ваш модульный тест обнаружит, что метод правильно возвращает false для данной строки, у вас все еще нет возможности быть уверенным, что она вернуласьfalse по правильной причине .Так что это не очень помогает в проверке правильности вашего кода.Есть несколько способов решить эту проблему:

  • Вы можете создать отдельный метод для каждого правила проверки, а затем checkFileValidLine вызовет каждый из этих методов для проверки строки.Таким образом, вы можете иметь юнит-тесты для этих методов (в дополнение к кратким юнит-тестам для checkFileValidLine, чтобы убедиться, что он вызывает эти методы и возвращает правильный результат).(Такой подход я бы рекомендовал.)
  • Вы можете создать вспомогательный метод, который выполняет те же проверки, что и текущий метод, но вместо возврата true для правильной строки и false дляневерный, он может вернуть null для правильной строки и (например) "line.length != 22" для неверной.Затем ваши модульные тесты могут убедиться, что точно сработало правильное правило проверки, а checkFileValidLine может просто вернуть true, если этот вспомогательный метод возвратил null.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...