Почему matcher возвращает false?
имеется тест:
@Test
public void sixTest() {
Specification.installSpec(Specification.requestSpec(), Specification.responseSpec());
Response response = given()
.when()
.get("/api/unknown")
.then()
.log().all()
.extract().response();
String value = response.path("data.color").toString();
String patternString = "#[0-9A-Z]{6}";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(value);
boolean matches = matcher.matches();
assertTrue(matches);
}
На выходе получаю matches false, почему? Ведь шаблон patternString соответствует полученному ответу. Т е в value содержится 6 значений из get запроса, дальше они проверяются на соответствие шаблона в matcher, но почему matcher возвращает false?
Вот responce:
{
page: 1,
per_page: 6,
total: 12,
total_pages: 2,
data: [
{
id: 1,
name: "cerulean",
year: 2000,
color: "#98B2D1",
pantone_value: "15-4020"
},
{
id: 2,
name: "fuchsia rose",
year: 2001,
color: "#C74375",
pantone_value: "17-2031"
},
...
Ответы (2 шт):
Результат выполнения этого кода:
String value = response.path("data.color").toString();
будет массив всех найденных значений data.color.
В вашем примере их как минимум 2.
То есть, это будет строка типа [#98B2D1, #C74375, ...].
Эта строка целиком не соответствует заданному регулярному выражению.
Почему matcher возвращает false?
Потому что метод Matcher::matches проверяет всю строку целиком:
public boolean matches()
Attempts to match the entire region against the pattern.
If the match succeeds then more information can be obtained via the start, end, and group methods.
Returns: true if, and only if, the entire region sequence matches this matcher's pattern
Если нужно найти количество совпадений, в Java 9 и выше можно выполнить такой код:
String value = given()
.when()
.get("/api/unknown")
.then()
.log().all()
.extract().asString();
Pattern pattern = Pattern.compile("#[0-9A-Z]{6}");
Matcher matcher = pattern.matcher(value);
assertEquals(6, matcher.results().count());