我有这个测试:
@Test
public void succeedsWhenFormatWithTwoCommas(){
String input = "#,###,###.##";
PriceFormatValidator priceFormatValidator = new PriceFormatValidator();
boolean answer = priceFormatValidator.validate(input);
assertTrue(answer);
}
并且在运行此代码时失败:
public boolean validate(String input) {
Pattern pattern = Pattern.compile("^#{1,3}(,?#{3})?(\\.#{0,3})?$");
Matcher matcher = pattern.matcher(input);
boolean isValid = matcher.matches();
return isValid;
}
为什么会这样?
答案 0 :(得分:0)
您可以通过以下方式补充您的模式:
Pattern pattern = Pattern.compile("^#{1,3}(,?#{3}){1,2}(\\.#{0,3})?$");
答案 1 :(得分:0)
您的^#{1,3}(,?#{3})?(\\.#{0,3})?$
正则表达式仅允许内部为1或0 ,###
因为(,?#{3})?
匹配可选序列1或0 ,
,后跟3个#
符号。
您需要将(,?#{3})?
部分转换为(,#{3})*
,以允许零个或多个,
+三个#
符号序列。
使用
"^#{1,3}(,#{3})*(\\.#{0,3})?$"
请参阅regex demo。
整个模式现在将匹配以下内容:
^
- 字符串开头#{1,3}
- 一到三#
(,#{3})*
- 零个或多个,
+ 3个#
符号序列(\\.#{0,3})?
- 可选的.
+ 0到3 #
符号$
- 字符串结束。 注意:最后的(\\.#{0,3})?
允许尾随.
。如果您不想这样,请将其更改为(\\.#{1,3})?
。
注意2 :如果您没有使用捕获的值(与(...)
模式匹配的值),最好将捕获组更改为非捕获组(即{ {1}} (...)
}。