论坛风格切换切换到宽版
  • 2750阅读
  • 10回复

[已解决]PASSOLO文本解析器规则设置:有关多行文本组成的字符串的提取 [复制链接]

上一主题 下一主题
离线Dreamby
 

发帖
265
金钱
340
威望
34
只看楼主 倒序阅读 0 发表于: 2017-06-04
要翻译的文本文件的格式是这样的:
  1. ;开始翻译
  2. 0000 Translate Text
  3. 0002 MultiLine Text Line1
  4. Line2
  5. Line...
  6. ;注释
  7. 0005 ddd

在行首为";"的行视为注释行。每个字符串以 3~4 个数字开始,这3~4个数字就是字符串的 ID。紧跟着一个空格,后面就是字符串的内容,可多行,直到下一个字符串ID或注释行为止。
也就是说提取出来的文本是
Translate Text
"MultiLine Text Line1
Line2
Line..."
"ddd"
字符串开始我设置为“^([0-9][0-9][0-9][0-9])\s” (启用正则表达式),但是字符串结束不知道应该如何设置才对。
请问各位大大,该如何设置相应的解析规则?

类似格式的语言文件可以参考 AdvOR 的语言文件。



本帖提到的人: @gnatix @wanfu
离线wanfu

发帖
2695
金钱
11800
威望
1180
只看该作者 1 发表于: 2017-06-10
尝试了一下,但是无法将多行合并成一行。


附件: 特殊格式文本解析规则.rar (1 K) 下载次数:12
离线Dreamby

发帖
265
金钱
340
威望
34
只看该作者 2 发表于: 2017-06-22
谢谢。可惜这样就无法达到升级翻译的目的。这样还不如直接编辑文本文件算了。
只能曲线救国了。我想到一个办法,步骤如下:
1.用文本编辑器的替换功能,把所有换行符替换为文件中不出现的字符,例如 {n}
2.把 {n}; 和 {n}[0-9]*\x20 中的 {n} 恢复为换行符
这样就把多行组合成一行。然后再使用文本解析规则定义来处理这个文件。把 {n} 映射为 \n

貌似复杂了点,通用性也很差,甚至有可能出现误判。不过暂时实在没有其它更好的办法了。
大大们,继续帮忙啊!!!!!
本帖提到的人: @gnatix @wanfu @cao_cong
离线偃月青龙

发帖
388
金钱
1520
威望
152
只看该作者 3 发表于: 2017-06-23
根据 Advanced Onion Router 0.3.1.3 语言文件头部的说明可知:
  1. 以分号 (;) 开始的行是注释。
  2. 字串以四位数字后接一个空格开始,之后是字串本身。开始的四位数字是字串 ID。
  3. 不是以分号或四位数字后接一个空格开始的行是字串的续行。

在 Passolo 的文本解析器中进行如下定义:


  1. [Rule]
  2. name="AdvOR 语言文件(*.lng)"
  3. ext="LNG"
  4. comment=";","<EOL>","0"
  5. string="^(\d{4})\x20{1}","\n(?=\d{4}\x20{1}|;)","0","1","5","1","0","1","","0"

以上文本解析规则可以正确解析 AdvOR 语言文件中的单行字串、多行字串,并不会将多行字串解析成多个单行字串。





附件: AdvOR 语言文件.rar (53 K) 下载次数:10
附件: AdvOR 语言文件解析规则.rar (1 K) 下载次数:9
离线wanfu

发帖
2695
金钱
11800
威望
1180
只看该作者 4 发表于: 2017-06-24
厉害,\x20{1} 中的 {1} 不需要。直接 \x20 就可以了
离线Dreamby

发帖
265
金钱
340
威望
34
只看该作者 5 发表于: 2017-06-26
谢谢 @偃月青龙 大大的提供的表达式。
我之前用过类似的表达式,
开始为  ^[0-9][0-9][0-9][0-9]\s
结尾为 \n^[0-9][0-9][0-9][0-9]\s
但是这样既不能匹配备注内容的上一行(这个我可以理解)
类似下面的情况
0001 abc
0002 bcd
0003 efg
还只能识别 0001 和 0003 行,0002 被跳过了。
请问偃月青龙大大,这是因为加括号的缘故还是 ?=a:b 表达式的作用?
本帖提到的人: @偃月青龙
离线偃月青龙

发帖
388
金钱
1520
威望
152
只看该作者 6 发表于: 2017-06-26
要弄明白这个问题就需要你了解一下正则表达式的语法了。

你给出的结束表达式是消耗字符的。
第一个字串使用第二个字串的 ID "0002"和后接的空格作为结束标记,下一个搜索将从ID 为“0002” 的字串本身开始,而它不满足条件,所以会被丢弃。

(?=a) 这样的表达式不消耗字符。
也就是说在找到一个匹配项之后,下一个搜索从 a 之前的位置开始。





离线z307874607

发帖
30
金钱
300
威望
30
只看该作者 7 发表于: 2017-06-28
偃月青龙 老师你好,能否帮忙做一个,连续 15 个无空格以上的字符能帮做个表达式不。比如类似这样的 “itemDoubleClicked” 因为这类字符一般没用,我想把他过滤掉。
离线偃月青龙

发帖
388
金钱
1520
威望
152
只看该作者 8 发表于: 2017-06-28
回 7楼(z307874607) 的帖子
z307874607:偃月青龙 老师你好,能否帮忙做一个,连续 15 个无空格以上的字符能帮做个表达式不。比如类似这样的 “itemDoubleClicked” 因为这类字符一般没用,我想把他过滤掉。 (2017-06-28 08:35) 

建议你新开一个帖子求助。
离线z307874607

发帖
30
金钱
300
威望
30
只看该作者 9 发表于: 2017-06-29
回 8楼(偃月青龙) 的帖子
偃月青龙:建议你新开一个帖子求助。 (2017-06-28 19:21) 

听老师的 开贴了 !辛苦老师帮帮忙。