Java регулярное выражение для соответствия неохотно - PullRequest
0 голосов
/ 23 февраля 2012

нужно найти выражение для следующей задачи:

String given = "{ \"questionID\" :\"4\", \"question\":\"What is your favourite hobby?\",\"answer\" :\"answer 4\"},{ \"questionID\" :\"5\", \"question\" :\"What was the name of the first company you worked at?\",\"answer\" :\"answer 5\"}";

Что я хочу получить: "{ \"questionID\" :\"4\", \"question\":\"What is your favourite hobby?\",\"answer\" :\"*******\"},{ \"questionID\" :\"5\", \"question\" :\"What was the name of the first company you worked at?\",\"answer\" :\"******\"}";

Что я пытаюсь:

    String regex = "(.*answer\"\\s:\"){1}(.*)(\"[\\s}]?)";
    String rep = "$1*****$3";
    System.out.println(test.replaceAll(regex, rep));

Что я получаю:

"{ \"questionID\" :\"4\", \"question\":\"What is your favourite hobby?\",\"answer\" :\"answer 4\"},{ \"questionID\" :\"5\", \"question\" :\"What was the name of the first company you worked at?\",\"answer\" :\"******\"}";

Из-за жадного поведения первая группа перехватывает обе «ответные» части, тогда как я хочу, чтобы она остановилась после нахождения достаточного количества, выполнить замену, а затем продолжить поиск.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2012

Узор

("answer"\s*:\s*")(.*?)(")

Кажется, делать то, что вы хотите. Вот экранированная версия для Java:

(\"answer\"\\s*:\\s*\")(.*?)(\")

Ключом здесь является использование (.*?) для соответствия ответу, а не (.*). Последний соответствует как можно большему числу символов, первый остановится как можно скорее.

Приведенный выше шаблон не будет работать, если в ответе есть двойные кавычки. Вот более сложная версия, которая позволит им:

("answer"\s*:\s*")((.*?)[^\\])?(")

Вам придется использовать $4 вместо $3 в шаблоне замены.

0 голосов
/ 23 февраля 2012

Для меня работает следующее регулярное выражение:

regex = "(?<=answer\"\\s:\")(answer.*?)(?=\"})";
rep = "*****";
replaceALL(regex,rep);

Возможно, неправильно экранированы \ и ", так как я тестировал без Java.

http://regexr.com?* 1010 303 мм *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...