Соответствие Java Regex между фигурными скобками
45349 просмотра
5 ответа
Мне нужно проанализировать файл журнала и получить время и соответствующую строку вызова функции. Она сохраняется в файле журнала следующим образом: {"time": "2012-09-24T03: 08: 50", "message": "Call ( ) началось"}
Между другими строковыми символами будет несколько зарегистрированных вызовов функций времени, поэтому я надеюсь использовать регулярные выражения для просмотра файла и получения всех этих
Я хотел бы получить всю зарегистрированную информацию, включая фигурные скобки
Я пробовал следующее
Pattern logEntry = Pattern.compile("{(.*?)}");
Matcher matchPattern = logEntry.matcher(file);
а также
Pattern.compile("{[^{}]*}");
Matcher matchPattern = logEntry.matcher(file);
Я продолжаю получать незаконные ошибки повторения, пожалуйста, помогите! Благодарю.
Автор: Eddie D Источник Размещён: 12.11.2019 09:31Ответы (5)
32 плюса
вам нужно убежать '{' & '}' с помощью '\'
так "{(.*?)}"
становится"\\{(.*?)\\}"
где вы должны избежать «\» с другим «\» первым
см: http://www.regular-expressions.info/reference.html для полного списка символов, которые необходимо экранировать ...
Автор: ckozl Размещён: 25.09.2012 03:288 плюса
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"
Автор: gtgaxiola
Размещён: 25.09.2012 03:27
3 плюса
Вы должны использовать позитивный взгляд и взгляд назад:
(?<=\{)([^\}]+)(?=\})
- (? <= {) Соответствует всему, за которым следует {
- ([^}] +) Соответствует любой строке, не содержащей}
- (? = {) Соответствует всему до {
0 плюса
{} в регулярном выражении имеют особое значение, поэтому их нужно экранировать.
Обычно экранирование достигается за счет того, что перед персонажем следует экранировать с помощью обратной косой черты. В классе символов, определенном в квадратных скобках, вам не нужно делать это
Так что-то вроде
Pattern.compile("\{[^{}]*\}");
Может быть ближе к тому, что вы хотите сделать
Автор: Vorsprung Размещён: 25.09.2012 03:290 плюса
Это прекрасно работает для не вложенных скобок, но для таких выражений, как
(sum(x) * 100) / (sum(y) + sum(z))
[a-z]*[\{]+([a-zA-Z0-9]+)[\}]+
работает.
Вопросы из категории :
- java В чем разница между int и Integer в Java и C #?
- java Как я могу определить IP моего маршрутизатора / шлюза в Java?
- java Каков наилучший способ проверки XML-файла по сравнению с XSD-файлом?
- java Как округлить результат целочисленного деления?
- java Преобразование списка <Integer> в список <String>
- java Почему я не могу объявить статические методы в интерфейсе?
- java Библиотека Java SWIFT
- java Выключение компьютера
- java Как я могу воспроизвести звук на Java?
- java Когда выбирать отмеченные и непроверенные исключения
- regex Learning Regular Expressions
- regex Regex и unicode
- regex Мое регулярное выражение слишком подходит. Как мне это остановить?
- regex Как выполнить подстановку Perl для строки, сохранив оригинал?
- regex Замена n-го экземпляра совпадения с регулярным выражением в Javascript
- regex Как заменить простые URL ссылками?
- regex Python re.sub с флагом не заменяет все вхождения
- regex Как проверить адрес электронной почты в JavaScript
- regex Как экранировать текст для регулярного выражения в Java
- regex Регулярное выражение, которое будет соответствовать объявлению метода Java