Java正则表达式帮助

时间:2012-03-10 00:02:45

标签: java regex maze

此检查仍然失败。我分开了条件,所以我可以测试它们。它失败了cs =“WWWW”,“WXW”,“WWWWWWWWWWWWWWWW”

/** 
 * 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 个答案:

答案 0 :(得分:2)

CharSequence cs = new String(line.toString());

在这里,你要创建一个数组的外观字符串。像“[C @ 333cb1eb”

这样的东西

在线上放下'toString()',你可能会更近一步。

答案 1 :(得分:1)

您似乎误解了括号表示法[...]的含义。它创建一个字符类,这意味着它只匹配一个字符,可能是...中的任何字符。 (有许多特殊的语法可以更好地控制它可以匹配的字符,但这是基本的想法。)所以,例如,你的这种模式:

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

要求字符串长度恰好为三个字符;第一个字符是W;第二个字符是W{10,逗号,2},或R;并且第三个字符是另一个W

在那种情况下,你真正应该写的只是:

^W+RW+$

确保字符串完全由W组成,但只有一个R,并且它以W开头和结尾。 (你真的不需要担心W的数量,因为到目前为止你已经确保字符串长度正好是22个字符。)


编辑添加:顺便说一句,你有单元测试很棒,但你的方法有一个如此狭窄的接口 - 它需要一个字符串,执行一堆验证,然后返回truefalse - 它不适合单元测试。如果你的单元测试发现该方法错误地返回给定字符串的false,那么你几乎没有关于出错的信息,所以找到问题没什么帮助。 (你已经亲眼见过了。)更糟糕的是,如果你的单元测试发现方法正确为给定的字符串返回false,你还是无法确定它因正确的原因返回false 。因此,确保您的代码正确无济于事。有几种方法可以解决这个问题:

  • 您可以为每个验证规则创建单独的方法,然后checkFileValidLine将调用每个方法来验证该行。这样,您可以对这些方法进行单元测试(除了checkFileValidLine的粗略单元测试,以确保它调用这些方法并返回正确的结果)。 (这是我推荐的方法。)
  • 您可以创建一个与当前方法执行相同验证的辅助方法,但不是为有效字符串返回true而对于无效字符串返回false,而是返回{{1} }表示有效字符串;(例如)null表示无效字符串。然后,您的单元测试可以确保完全触发正确的验证规则,而"line.length != 22"如果该辅助方法返回checkFileValidLine则可以返回true。 / LI>
相关问题