如何用Java编写Ruby-regex模式(包括递归命名分组)?

时间:2011-10-24 21:05:15

标签: java ruby regex netbeans recursive-regex

嗯...我有一个包含tintin-script的文件。现在我已经设法从中获取所有操作和替换,以显示它们在使用Ruby的网站上正确排序,这有助于我保持概述。

示例TINTIN-script

#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-App中抓取它们,我将我的脚本文件读入一个varibable'input',然后使用以下模式扫描'input'

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-pattern。似乎是命名组捕获,尤其是Java中不支持这些组的递归应用。没有 似乎无法找到有效的解决方案......

这里又是红宝石图案......

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

任何人都可以帮我创建一个匹配相同的java模式吗?

非常感谢提示/提示/想法,尤其是解决方案或(接近解决方案的评论)!

2 个答案:

答案 0 :(得分:2)

你的文字格式看起来很简单;你可能不需要递归匹配。这个与Java兼容的正则表达式可以正确匹配您的样本数据,据我所知:

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

这对你有用吗?如果您运行Java 7,您甚至可以命名组。 ;)

答案 1 :(得分:1)

  

任何人都可以帮我创建一个匹配相同的java模式吗?

不,没有人可以:Java的正则表达式引擎不支持递归模式(如Ruby 1.9所做的那样)。