Соответствие 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]+)[\}]+
работает.