如何在 Java 中编写 Ruby 正则表达式模式(包括递归命名分组)?

发布于 2024-12-11 13:30:52 字数 2089 浏览 0 评论 0原文

嗯...我有一个包含丁丁脚本的文件。现在我已经设法从中获取所有操作和替换,以显示它们在使用 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 应用程序中获取它们,我将脚本文件读入变量“输入”,然后使用以下模式扫描“输入”

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文件,并从文件中抓取所有“操作”和“替换”并显示在eTable中,我可以在其中双击一个项目来打开修改窗口。

到目前为止,我已经设置了模块并准备好了一切,我只是不知道如何将我编写的 ruby​​-regex 模式转换为工作的 java-regex-pattern。 Java 似乎不支持命名组捕获,尤其是这些组的递归应用。如果没有这个似乎无法找到一个可行的解决方案...

这又是 ruby​​ 模式...

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

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

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

well... i have a file containing tintin-script. Now i already managed to grab all actions and substitutions from it to show them properly ordered on a website using Ruby, which helps me to keep an overview.

Example 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}

To grab them in my Ruby-App i read my script-file into a varibable 'input' and then use the following pattern to scan the '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
}

Now my idea was to use the netbeans platform to write a module to not only keep an overview but also to assist editing the tintin script file. So opening the file in an Editor-Window I still need to parse the tintin-file and have all 'actions' and 'substitutions' from the file grabbed and displayed in an eTable, in wich I could dbl-click on one item to open a modification-window.

I've setup the module and got everything ready so far, i just can't figure out how to translate the ruby-regex pattern i've written to a working java-regex-pattern. It seems named-group-capturing and especially the recursive application of these groups is not supported in Java. Without that I seem to be unable to find a working solution...

Here's the ruby pattern again...

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

Can anyone help me to create a java pattern that matches the same?

Many thanks in advance for tips/hints/ideas and especially for solutions or (close-to-solution comments)!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你对谁都笑 2024-12-18 13:30:52

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

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

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

Your text format seems pretty simple; it's possible you don't really need recursive matching. This Java-compatible regex matches your sample data correctly, as far as I can tell:

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

Would that work for you? If you run Java 7, you can even name the groups. ;)

国产ˉ祖宗 2024-12-18 13:30:52

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

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

Can anyone help me to create a java pattern that matches the same?

No, no one can: Java's regex engine does not support recursive patterns (as Ruby 1.9 does).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文