Соответствие Java Regex между фигурными фигурными скобками

Мне нужно проанализировать файл журнала и получить время и связанную строку вызова функции Это сохраняется в файле журнала: { "time": "2012-09-24T03: 08: 50", "message": "Call() запущен" }

Между другими строковыми символами будут выполняться вызовы с несколькими записями времени, поэтому я надеюсь использовать регулярное выражение для доступа к файлу и захватить все эти

Я хотел бы захватить всю зарегистрированную информацию, включая фигурные скобки

Я пробовал следующее

Pattern logEntry = Pattern.compile("{(.*?)}");
Matcher matchPattern = logEntry.matcher(file);

и

Pattern.compile("{[^{}]*}");
Matcher matchPattern = logEntry.matcher(file);

Я продолжаю получать незаконные ошибки повторения, пожалуйста, помогите! Спасибо.

Ответ 1

вам нужно сбежать '{' и '}' с помощью '\'

так: "{(.*?)}" становится: "\\{(.*?)\\}"

где вам нужно избежать "\" с другим "\" первым

см. http://www.regular-expressions.info/reference.html для исчерпывающего списка символов, которым требуется экранирование...

Ответ 2

Braces - специальные символы регулярных выражений, используемые для групп повторения, поэтому вы должны избегать их.

Pattern logEntry = Pattern.compile("\\{(.*?)\\}");

Простой тестер:

 public static void main(String[] args) throws Exception {
        String x =  "{\"time\" : \"2012-09-24T03:08:50\", \"message\" : \"Call() started\"}";
        Pattern logEntry = Pattern.compile("\\{(.*?)\\}");
        Matcher matchPattern = logEntry.matcher(x);

        while(matchPattern.find()) {
            System.out.println(matchPattern.group(1));
        }

    }

Дает мне:

"time" : "2012-09-24T03:08:50", "message" : "Call() started"

Ответ 3

Вы должны использовать положительный lookahead и lookbehind:

(?<=\{)([^\}]+)(?=\})
  • (? <= {) Совпадает со всем, за которым следует {
  • ([^}] +) Соответствует любой строке, не содержащей}
  • (? = {) Совпадает со всем до {

Ответ 4

{} в regexp имеют особое значение, поэтому их нужно экранировать.

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

Так что-то вроде

Pattern.compile("\{[^{}]*\}");

Может быть ближе к тому, что вы хотите сделать

Ответ 5

Это отлично работает для не вложенных скобок, но для выражений типа

(sum(x) * 100) / (sum(y) + sum(z))

[a-z]*[\{]+([a-zA-Z0-9]+)[\}]+ работает.