您似乎误解了括号符号的含义[...]
。它创建了一个字符类,这意味着它只匹配一个字符,可以是...
. (有许多特殊语法可以更好地控制它可以匹配的字符,但这是基本思想。)例如,你的这个模式:
^W[W{10,20}R{1}]W$
要求字符串长度恰好为三个字符;第一个字符是 a W
; 第二个字符是 a W
, a {
, a 1
, a 0
, a comma, a 2
, a }
, or an R
; 第三个字符是另一个W
。
在那种情况下,你真正应该写的只是:
^W+RW+$
确保字符串完全由W
s 组成,除了 one R
,并且它以W
s 开头和结尾。(您实际上不需要担心W
s 的数量,因为此时您已经确保字符串的长度正好为 22 个字符。)
编辑补充:顺便说一句,你有单元测试真是太棒了,但是你的方法有一个如此狭窄的接口——它需要一个字符串,执行一堆验证,然后只是返回true
或者false
——它真的不适合单元——测试。如果您的单元测试发现该方法错误地返回false
给定字符串,那么您将几乎没有关于哪里出了问题的信息,因此对于查找问题没有多大帮助。(您自己已经看到了。)更糟糕的是,如果您的单元测试发现该方法正确返回false
给定字符串,您仍然无法确定它是否false
出于正确的原因返回. 因此,它对确保您的代码正确无济于事。有几种方法可以解决这个问题:
- 您可以为每个验证规则创建一个单独的方法,然后
checkFileValidLine
调用这些方法中的每一个来验证该行。这样,您可以对这些方法进行单元测试(除了粗略的单元测试checkFileValidLine
以确保它正在调用这些方法并返回正确的结果)。(这是我推荐的方法。)
- 您可以创建一个辅助方法来执行与当前方法相同的验证,但不是返回
true
有效字符串和false
无效字符串,而是可以返回null
有效字符串和(例如)无效字符串"line.length != 22"
。然后,您的单元测试可以确保触发了正确的验证规则,而如果该辅助方法返回,则checkFileValidLine
可以返回。true
null