Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式(和单元测试how-to)对BAT进行编码_Java_Regex_Unit Testing - Fatal编程技术网

Java 使用正则表达式(和单元测试how-to)对BAT进行编码

Java 使用正则表达式(和单元测试how-to)对BAT进行编码,java,regex,unit-testing,Java,Regex,Unit Testing,这个问题是正则表达式实践和单元测试实践的结合 正则表达式部分 我写这个问题是为了个人实践: 给定一个数字作为字符串,使用逗号分隔千。数字可以包含可选的减号和可选的小数部分。不会有任何多余的前导零 以下是我的解决方案: String separateThousands(String s) { return s.replaceAll( String.format("(?:%s)|(?:%s)", "(?<=\\G\\d{3})(?=\\d)",

这个问题是正则表达式实践和单元测试实践的结合

正则表达式部分 我写这个问题是为了个人实践:

给定一个数字作为字符串,使用逗号分隔千。数字可以包含可选的减号和可选的小数部分。不会有任何多余的前导零

以下是我的解决方案:

String separateThousands(String s) {
  return s.replaceAll(
      String.format("(?:%s)|(?:%s)",
        "(?<=\\G\\d{3})(?=\\d)",
        "(?<=^-?\\d{1,3})(?=(?:\\d{3})+(?!\\d))"
      ),
      ","
  );
}

我在工业强度单元测试方面没有太多经验,所以我想知道其他人是否可以评论这是否是一个好的报道,我是否遗漏了任何重要的内容,等等(如果我遗漏了一个场景,我总是可以添加更多的测试).

当您陈述这些要求时,您是否打算通过您的方法来实施这些要求

该号码可能包含一个可选字符 减号和可选的小数 部分不会再有了 多余的前导零

如果您的目的是让该方法在违反这些约束时进行检测,那么您将需要额外的代码来编写额外的单元测试,以确保契约得到执行

1234.5678.91011
进行测试怎么样

您希望您的方法返回1234.5678.91011还是忽略整个过程? 最好编写一个测试来验证您的期望值

这对我很有用:

return s.replaceAll("(\\G-?\\d{1,3})(?=(?:\\d{3})++(?!\\d))", "$1,");
第一次通过时,
\G
的作用与
^
相同,并且向前看强制
\d{1,3}
仅消耗所需的字符数,以便在三位数边界处保留匹配位置。在此之后,
\d{1,3}
每次使用最多三位数字,并使用
\G
将其固定到上一个匹配的末尾


至于您的单元测试,我只想在问题描述中说明,输入总是有效的数字,最多有一个小数点。

这些问题都很好。我真的不确定我应该如何处理单元测试。现在,如果输入是“无效的”(根据谁的定义,我不确定),我只会尖叫“未定义的行为!”。我不确定这是否是进行单元测试的正确方法。也许我应该读一本书。我们实际上只是依靠底层的正则表达式引擎来找到匹配的文本,并在适当的地方应用转换。我想最重要的测试是在文本不属于的地方添加逗号,以确保文本不会出现格式错误。@Alan:所有格量词有什么意义吗?@poly:没有。它使前瞻无限高效,但没有它,正则表达式不会失败。艾伦:我没有做任何测试,但我的直觉告诉我,我的正则表达式更快,因为它不使用任何捕获组,
\0
是空的,并且不太经常需要可变长度的先行(比较起来,更频繁的休息更简单)。明天将做一些测试和报告(需要睡眠)。@poly:如果性能是一个真正的问题,不使用捕获可能会有很大的不同——这一点很好。即使我没有使用paren,而是使用了
$0
而不是
$1
,我也可以这样做。大部分成本将来自解析组引用和构建替换字符串;我希望这会使正则表达式性能上的任何差异相形见绌。@poly:至于态度级数:太好了!但我希望你不要完全失去热情;您对
repeatEnd
问题()的解决方案非常出色。您所要求的不一定是单元测试。它更多的是覆盖测试。
return s.replaceAll("(\\G-?\\d{1,3})(?=(?:\\d{3})++(?!\\d))", "$1,");