价格格式无法匹配逗号

时间:2016-10-10 08:38:20

标签: java regex string-formatting

我有这个测试:

@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;
}

为什么会这样?

2 个答案:

答案 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}} (...)}。