Java 如何确保一个字符串的子字符串正好有n次?

Java 如何确保一个字符串的子字符串正好有n次?,java,junit,tdd,assertj,Java,Junit,Tdd,Assertj,我想检查一个字符串是否包含某个子字符串n次。我知道我能做到: Assertions.assertThat(myString).contains(“xyz”) 甚至 Assertions.assertThat(myString).containsOnlyOnce(“xyz”) 但我怎样才能保证n次 我试过这样的方法: String testString = "XXwwYYwwLOK"; int count = 0; while (testString

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

Assertions.assertThat(myString).contains(“xyz”)

甚至
Assertions.assertThat(myString).containsOnlyOnce(“xyz”)

但我怎样才能保证n次

我试过这样的方法:

        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);
        }
Assertions.assertThat(myString.arequickly)(n,myString.contains(“xyz”)但遗憾的是,这是不可编译的


有什么想法吗?

你可能正在寻找

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


你可以这样做:

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

我没有测试这段代码,但它应该可以工作。

AssertJ的方法是使用,但它需要一点工作来实现它,所以我将使用StringUtils.countMatches,正如Rahul Tripathi建议的那样。

Hamcrest有正则表达式的匹配器。你可以

assertThat(实际,匹配模式(((mystring.*?){2}))

这将测试
mystring
是否正好显示两次


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

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


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

这是一个棘手的问题。
assertThat(“aaa”)呢。
assertThat(“aaa”)是什么意思?确切地说是(2,“aa”)
?这是真的吗?@Tunaki不,这甚至不正确compile@JoelCostigliola我知道它不会编译。重点不是编译,而是它应该返回什么。是
“aa“
“aaa”
中出现2次或1次?”?这就是为什么我说这很棘手还有另一个图书馆。。。Kayaman我想他实际上指的是
assertj
库(他用来测试断言的库),而不是
aspectj
:-)从这个角度来看(看看已经实现了多少不同的断言,
assertj
),除了
containsOnlyOnce(String expected)
,还有
containsStimes(int n,String expected)
,这将非常方便,但在这种情况下,这并不能回答问题,因为OP要求在单元测试中执行此操作,最好是使用匹配器。除此之外,最好不要发布您没有运行的代码。