我在Java中开发,我有一长串文本,其中包含了我需要的关于特定DVD的所有信息。(这是来自HandBrakeCLI的扫描输出)。我需要建立一个正则表达式,它将捕获我需要的每一点信息,但忽略一些特殊情况。我的程序包括DVD,标题,章节和语言对象。结构是这样的:DVD有标题标题有章节和语言我需要从输出中正则化出以下信息:标题编号-语言名称和音轨编号-章节编号
一个给我带来特别麻烦的特殊情况是,一些标题开始扫描,但随后输出说它们被忽略了,因为它太短了,并且从下一个标题开始。我不知道如何写一个正则表达式,会忽略任何匹配,其中包含。我一直很难弄明白!
scan: scanning title (d+)?.{0,500}(ignoring title)
这将捕获所有需要忽略的标题,但我认为我需要一个长正则表达式,它将捕获我需要的所有信息,并忽略特殊情况。如果我能以某种方式将每个有效的标题扫描绑定到一个组中,那就太棒了!非常感谢你的帮助!
下面是输出的示例:
[11:25:53] scan: DVD has 9 title(s)
[11:25:53] scan: scanning title 1
[11:25:53] scan: opening IFO for VTS 1
[11:25:53] scan: duration is 00:00:00 (76 ms)
[11:25:53] scan: ignoring title (too short)
[11:25:53] scan: scanning title 2
[11:25:53] scan: opening IFO for VTS 2
[11:25:53] scan: duration is 01:59:27 (7167153 ms)
[11:25:53] pgc_id: 1, pgn: 1: pgc: 0x1bad980
[11:25:53] scan: vts=2, ttn=1, cells=0->17, blocks=4->3, 1906832 blocks
[11:25:53] scan: checking audio 1
[11:25:53] scan: id=80bd, lang=English (AC3), 3cc=eng ext=0
[11:25:53] scan: checking audio 2
[11:25:53] scan: id=81bd, lang=Deutsch (AC3), 3cc=deu ext=0
[11:25:53] scan: checking audio 3
[11:25:53] scan: id=82bd, lang=English (AC3), 3cc=eng ext=0
[11:25:53] scan: checking audio 4
[11:25:53] scan: id=83bd, lang=Espanol (AC3), 3cc=spa ext=0
[11:25:53] scan: checking audio 5
[11:25:53] scan: id=84bd, lang=Francais (AC3), 3cc=fra ext=0
[11:25:53] scan: checking audio 6
[11:25:53] scan: id=85bd, lang=Italiano (AC3), 3cc=ita ext=0
[11:25:53] scan: checking audio 7
[11:25:53] scan: id=86bd, lang=Portugues (AC3), 3cc=por ext=0
[11:25:53] scan: checking audio 8
[11:25:53] scan: id=87bd, lang=Samoan (AC3), 3cc=smo ext=0
[11:25:53] scan: checking subtitle 1
[11:25:53] scan: id=20bd, lang=English, 3cc=eng
[11:25:53] scan: title 2 has 18 chapters
[11:25:53] scan: chap 1 c=0->0, b=4->51422 (51419), 127306 ms
[11:25:53] scan: chap 2 c=1->1, b=51423->79617 (28195), 100277 ms
[11:25:53] scan: chap 3 c=2->2, b=79618->170050 (90433), 233291 ms
[11:25:53] scan: chap 4 c=3->3, b=170051->192087 (22037), 85367 ms
[11:25:53] scan: chap 5 c=4->4, b=192088->327371 (135284), 568451 ms
[11:25:53] scan: chap 6 c=5->5, b=327372->431726 (104355), 283191 ms
[11:25:53] scan: chap 7 c=6->6, b=431727->441166 (9440), 40203 ms
[11:25:53] scan: chap 8 c=7->7, b=441167->675145 (233979), 977815 ms
[11:25:53] scan: chap 9 c=8->8, b=675146->870812 (195667), 778680 ms
[11:25:53] scan: chap 10 c=9->9, b=870813->959026 (88214), 218223 ms
[11:25:53] scan: chap 11 c=10->10, b=959027->1134726 (175700), 748540 ms
[11:25:53] scan: chap 12 c=11->11, b=1134727->1375583 (240857), 1013772 ms
[11:25:53] scan: chap 13 c=12->12, b=1375584->1452670 (77087), 204138 ms
[11:25:53] scan: chap 14 c=13->13, b=1452671->1461940 (9270), 41303 ms
[11:25:53] scan: chap 15 c=14->14, b=1461941->1698075 (236135), 1069800 ms
[11:25:53] scan: chap 16 c=15->15, b=1698076->1826069 (127994), 367324 ms
[11:25:53] scan: chap 17 c=16->16, b=1826070->1906831 (80762), 309385 ms
[11:25:53] scan: chap 18 c=17->17, b=0->3 (4), 76 ms
[11:25:53] scan: aspect = 0
[11:25:53] scan: scanning title 3
标题3与标题2相似,标题5与标题1相似
好吧,所以这不是完全正确的解决方案,但我找到了一个工作,它工作得很好。我决定为每个单独的Title创建一个唯一的字符串。这真的很简单。一旦程序到达与:scan: scanning title (d+?)
匹配的第一行,我就创建了一个新的title对象,并为它启动一个新的字符串生成器。然后我对每个单独的字符串进行了重新定义。如果它匹配ignore
,那么我就忽略它,从而处理该异常。从那里,很容易找到我需要的每个标题的信息。这个程序现在工作了,我很高兴地说,当你把我花在它上面的所有时间加起来,并将它与我使用GUI单独排队所花费的时间进行比较时,我节省了大约……呃…5个小时…所以这不是一个巨大的节省,但它比点击一百万次要好一百万倍。哈哈,无论如何,感谢所有帮助这个项目的人(包括其他关于这个项目的帖子)。