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

java regex

45349 просмотра

5 ответа

159 Репутация автора

Мне нужно проанализировать файл журнала и получить время и соответствующую строку вызова функции. Она сохраняется в файле журнала следующим образом: {"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 Источник Размещён: 25.09.2012 03:25

Ответы (5)


8 плюса

8289 Репутация автора

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

32 плюса

6320 Репутация автора

Решение

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

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

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

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

Автор: ckozl Размещён: 25.09.2012 03:28

0 плюса

25443 Репутация автора

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

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

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

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

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

Автор: Vorsprung Размещён: 25.09.2012 03:29

3 плюса

594 Репутация автора

Вы должны использовать позитивный взгляд и взгляд назад:

(?<=\{)([^\}]+)(?=\})
  • (? <= {) Соответствует всему, за которым следует {
  • ([^}] +) Соответствует любой строке, не содержащей}
  • (? = {) Соответствует всему до {
Автор: gnom1gnom Размещён: 14.04.2015 09:02

0 плюса

1 Репутация автора

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

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

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

Автор: Jeevan Kumar Chamarthi Размещён: 02.03.2016 05:51
Вопросы из категории :
32x32