Регулярные выражения Java - PullRequest
       9

Регулярные выражения Java

1 голос
/ 11 января 2010

Привет,

У меня следующий синтаксис:

@AAAA{tralala10aa,
  author = {Some Author},
  title = {Some Title},
  booktitle = {Some Booktitle},
  year = {2010},
  month = {March},
  booktitle_short = {CC 2010},
  conference_url = {http://www.mmmm.com},
  projects = {projects}
}

....

Я сделал следующее регулярное выражение:

@[A-Z]*[{][a-z0-9]*[,]

но мне нужен весь текстовый блок. Как я могу это сделать?

Ответы [ 4 ]

4 голосов
/ 11 января 2010

Похоже, вам было бы гораздо лучше использовать грамматику без контекста вместо регулярного выражения в этом случае. Попробуйте использовать генератор синтаксического анализатора, например CUP или ANTLR .

2 голосов
/ 11 января 2010

Если «блок» всегда заканчивается одиночной закрывающей скобкой, то это может сделает это:

"(?ms)@[A-Z]+\\{.+?^\\}$"

Где (?ms) устанавливает выражение для "multiline" и "dotall" (так что .+ также может соответствовать символам новой строки), а материал в конце соответствует закрывающей скобке на строке.

Знак вопроса в середине делает совпадение .+ нежадным, поэтому оно не будет соответствовать всем блокам вплоть до и включая последний блок в файле.

2 голосов
/ 11 января 2010

Если вложение на фигурные скобки допускается только на одну глубину:

/@[A-Z]*{([^{}]*+|{[^{}]*+})*}/

Обратите внимание на использование собственнического квантификатора *+ - без него это может занять довольно много времени при неудачных матчах.

Я не уверен, поддерживает ли это Java - если нет, удалите его, но имейте в виду плохое поведение при сбое.

0 голосов
/ 11 января 2010

Я бы не использовал регулярные выражения, я бы разбил строку на строки и создал словарь. Извините, это реализация Python (не Java):

>>> s ="""@AAAA{tralala10aa,
  author = {Some Author},
  title = {Some Title},
  booktitle = {Some Booktitle},
  year = {2010},
  month = {March},
  booktitle_short = {CC 2010},
  conference_url = {http://www.mmmm.com},
  projects = {projects}
}"""
>>> 
>>> s
'@AAAA{tralala10aa,\n  author = {Some Author},\n  title = {Some Title},\n  booktitle = {Some Booktitle},\n  year = {2010},\n  month = {March},\n  booktitle_short = {CC 2010},\n  conference_url = {http://www.mmmm.com},\n  projects = {projects}\n}'
>>> 
>>> 
>>> lst = s.replace('@AAA', '').replace('{', '').replace('}', '').split(',\n')
>>> lst
['Atralala10aa', '  author = Some Author', '  title = Some Title', '  booktitle = Some Booktitle', '  year = 2010', '  month = March', '  booktitle_short = CC 2010', '  conference_url = http://www.mmmm.com', '  projects = projects\n']
>>> dct = dict((x[0].strip(), x[1].strip()) for x in (y.split('=') for y in lst[1:]))
>>> dct
{'booktitle_short': 'CC 2010', 'title': 'Some Title', 'booktitle': 'Some Booktitle', 'author': 'Some Author', 'month': 'March', 'conference_url': 'http://www.mmmm.com', 'year': '2010', 'projects': 'projects'}
>>> 
>>> dct['title']
'Some Title'
>>> 

Надеюсь, приведенный выше код не требует пояснений.

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