Как написать шаблон Ruby-regex в Java (включая рекурсивную именованную группировку)? - PullRequest
1 голос
/ 25 октября 2011

хорошо ... у меня есть файл, содержащий tintin-script.Теперь мне уже удалось собрать все действия и замены из него, чтобы показать их правильное упорядочение на веб-сайте с использованием Ruby, что помогает мне вести обзор.

Пример TINTIN-скрипта

#substitution {You tell {([a-zA-Z,\-\ ]*)}, %*$}
              {<279>[<269> $sysdate[1]<279>, <269>$systime<279> |<219> Tell  <279>] <269>to   <219>%2<279> : <219>%3} 
              {4}
#substitution {{([a-zA-Z,\-\ ]*)} tells you, %*$}  
              {<279>[<269> $sysdate[1]<279>, <269>$systime<279> |<119> Tell  <279>] <269>from <119>%2<279> : <119>%3} 
              {2}

#action {Your muscles suddenly relax, and your nimbleness is gone.}
{
    #if {$sw_keepaon}
    {
        aon;
    };
} {5}

#action {xxxxx}
{
    #if {$sw_keepfamiliar}
    {
        familiar $familiar;
    };
} {5}

Чтобы получить их в моем Ruby-приложении, я считываю свой скрипт-файл в переменный «ввод», а затем использую следующий шаблон для сканирования «ввода».'

pattern = /(?<braces>{([^{}]|\g<braces>)*}){0}^#(?<type>action|substitution)\s*(?<b1>\g<braces>)\s*(?<b2>\g<braces>)\s*(?<b3>\g<braces>)/im

input = ""

File.open("/home/igambin/lmud/lmud.tt") { |file| input = file.read }

input.scan(pattern) { |prio, type, pattern, code|
  ## here i usually create objects, but for simplicity only output now
  puts "Type    : #{type}"
  puts "Pattern : #{pattern}"
  puts "Priority: #{prio}"
  puts "Code    :\n#{code}"
  puts
}

Теперь моя идея заключалась в том, чтобы использовать платформу netbeans для написания модуля, чтобы не только вести обзор, но и помогать редактировать файл сценария tintin.Таким образом, открывая файл в окне редактора, мне все еще нужно проанализировать tintin-файл и получить все «действия» и «замены» из файла, захваченные и отображенные в eTable, в которых я мог бы щелкнуть по одному элементу, чтобы открытьокно модификации.

Я уже настроил модуль и все готово, я просто не могу понять, как перевести шаблон ruby-regex, который я написал, в работающий java-regex-шаблон.Кажется, захват именованных групп и особенно рекурсивное применение этих групп не поддерживается в Java.Без этого I , кажется, не может найти рабочее решение ...

Вот снова образец рубина ...

pattern = /(?<braces>{([^{}]|\g<braces>)*}){0}^#(?<type>action|substitution)\s*(?<b1>\g<braces>)\s*(?<b2>\g<braces>)\s*(?<b3>\g<braces>)/im

Может кто-нибудь помочь мне создать шаблон Java, который совпадает с тем же?

Большое спасибо заранее за советы / советы / идеи и особенно за решения или (комментарии к решению)!

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Ваш текстовый формат кажется довольно простым; возможно, вам не нужно рекурсивное сопоставление. Насколько я могу судить, это Java-совместимое регулярное выражение соответствует вашим образцам данных:

(?s)#(substitution|action)\s*\{(.*?)\}\s*\{(.*?)\}\s*\{(\d+)\}

Будет ли это работать для вас? Если вы используете Java 7, вы можете даже назвать группы. ;)

1 голос
/ 25 октября 2011

Может кто-нибудь помочь мне создать шаблон Java, который совпадает с?

Нет, никто не может: движок Java regex не поддерживает рекурсивные шаблоны (как в Ruby 1.9).

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