1

好吧...我有一个包含 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-App 中获取它们,我将脚本文件读入变量“输入”,然后使用以下模式扫描“输入”

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模式?

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

4

2 回答 2

2

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

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

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

于 2011-10-24T22:36:00.480 回答
1

谁能帮我创建一个与之匹配的java模式?

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

于 2011-10-24T21:22:05.667 回答