如何确保字符串的子字符串正好n次?

时间:2015-12-15 14:13:04

标签: java junit tdd assertj

我想检查String是否包含某个子字符串n次。我知道我能做到:

Assertions.assertThat(myString).contains("xyz");

甚至 Assertions.assertThat(myString).containsOnlyOnce("xyz");

但我如何确保这一次?

我尝试过类似的事情:

Assertions.assertThat(myString).areExactly(n, myString.contains("xyz"));但遗憾的是这不可编辑。

有什么想法吗?

5 个答案:

答案 0 :(得分:9)

您可能正在寻找StringUtils.countMatches

  

计算一个字符串在另一个字符串中的出现次数

答案 1 :(得分:1)

您可以使用像这样的正则表达式来测试字符串“ myString”的子字符串“ xyz” n次。

Assertions.assertThat(myString).containsPattern("(xyz.*?){n}");

您可以将n替换为要测试的子字符串的计数。

答案 2 :(得分:0)

您可以执行以下操作:

        String testString = "XXwwYYwwLOK";
        int count = 0;
        while (testString.contains("ww")) {
            count++;
            int index = testString.indexOf("ww");
            if(index + 1 == testString.length()){
                break;
            }
            testString = testString.substring(index + 1);
        }

我没有测试过这段代码,但它应该有效。

答案 3 :(得分:0)

AssertJ的方式是使用Condition,但它需要一些工作来实现它,所以我会使用StringUtils.countMatches作为Rahul Tripathi建议。

答案 4 :(得分:0)

Hamcrest具有用于正则表达式的匹配器。你可以做

assertThat(actual, matchesPattern("(mystring.*?){2}))

哪个会测试mystring正确显示两次

http://hamcrest.org/JavaHamcrest/javadoc/2.0.0.0/org/hamcrest/text/MatchesPattern.html

是的,另一个库,但是对于断言,这应该是您唯一需要的一个。 :-)