сопоставление шаблонов для строки, имеющей «{«

#java #regex

#java #регулярное выражение

Вопрос:

Сначала я сделал это —

 String str = "{"hits":[{"links_count":6,"forum_count":11}],"totalHitCount":1}";

        Assert.assertTrue(str.matches("{"hits":[{"links_count":[0-9]{1,},"forum_count   ":11}],"totalHitCount":[0-9]{1,}}"),
            "Partnership message does not appear");
  

Это привело меня к следующей ошибке —

  Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal repetition
{"hits":[{"links_count":[0-9]{1,},"forum_count":11}],"totalHitCount":[0-9]{1,}}
  

Затем я сделал (экранирует «{«) —

 String str = "\{"hits":[\{"links_count":6,"forum_count":11\}],"totalHitCount":1\}";

    Assert.assertTrue(str.matches("\{"hits":[\{"links_count":[0-9]{1,},"forum_count":11\}],"totalHitCount":[0-9]{1,}\}"),
            "Partnership message does not appear");
  

и получил следующую ошибку —

 Exception in thread "main" java.lang.AssertionError: Partnership message does not appear expected:<true> but was:<false>
  

Чего мне здесь не хватает?

Ответ №1:

Вам не нужно экранировать { [ при вводе. Но вам нужно выполнить экранирование [ ] в вашем регулярном выражении.

Попробуйте это:

 String str = "{"hits":[{"links_count":6,"forum_count":11}],"totalHitCount":1}";

System.out.println(str.matches("\{"hits":\[\{"links_count":[0-9]{1,},"forum_count":11\}\],"totalHitCount":[0-9]{1,}\}"));
  

Ответ №2:

Вы правы, экранируя фигурные скобки в вашем регулярном выражении (строка внутри matches("...") ), поскольку в противном случае они интерпретируются как повторение шаблона.

Однако вам не следует избегать фигурных скобок внутри str самой себя, поскольку это только нарушит работу в вашем случае.

Существует этот приятный онлайн-инструмент, который может оказаться полезным при отладке регулярных выражений Java.

Ответ №3:

Правильное регулярное выражение:

 str.matches("\{"hits":\[\{"links_count":[0-9] ,"forum_count":[0-9] \}\],"totalHitCount":[0-9] \}")
  

Ответ №4:

Вам не хватало квадратных скобок []

 String str = "{"hits":[{"links_count":6,"forum_count":11}],"totalHitCount":1}";
  

Это вернет true

 Assert.assertTrue(str.matches("\{"hits":\[\{"links_count":[0-9]{1,},"forum_count":11\}\],"totalHitCount":[0-9]{1,}\}"),"Partnership message does not appear");