2012-01-17 64 views
0

我在文本数据库,中国在这个格式保存项工作:复杂的字符串解析

繁体简体[PIN1 jin]金/英语相当于1 /当量2/

我试图解析它使用分隔符(Java)。

这是我到目前为止有:

    String delims = "[\\[\\]/]+"; 
        String tokens[] = str.split(delims); 

的问题是等价的英语形式也包含分隔符标记。

例如:

⿔⿔的龟[GUI1] /变异|龟[GUI1]/

人们如何解析字符串?

我想从字符串的以下信息:

简体:⿔

传统:⿔

拼音:GUI1

英语等效:龟的变体|龟[ gui1]

+0

请详细说明,更多的,则该字符串是没有意义的。 – 2012-01-17 05:45:58

+0

你的意思是说你有一个字符串'a/b/c /',其中b也可能包含分隔符'/'? a和c是否可以包含分隔符? – brianestey 2012-01-17 05:46:03

+0

是CEDICT吗?你可能会错过什么。格式应该是“繁体简体[pin1 yin1] /英文等效1 /等效2 /.../等效n /” – wuliang 2012-05-08 22:00:44

回答

2

尝试使用正则表达式来清理整个字符串。

String text = "⿔ ⿔ [gui1] /variant of 龜|龟[gui1]/"; 

String pattern = "(\\S+)\\s*(\\S+)\\s*\\[(.+?)\\]\\s*/(.+?)/"; 

text = text.replaceAll(pattern, "$1;$2;$3;$4")); 

(\\S+) --->
找到连续的非白色空间群

\\s* --->
找到连续白色空间

\\[(.+?)\\] --->gui1
找到里面的一切[ bla bla bla ]
'?'将匹配最短的答案。
例如[血乳酸血乳酸]而非[血乳酸血乳酸] [BLE BLE ]

/(.+?)/ --->variant of 龜|龟[gui1]
与上面相同,但发现里面的一切/血乳酸血乳酸/
'?“将匹配最短

您可以测试正则表达式here


现在text变为:
⿔;⿔;gui1;variant of 龜|龟[gui1]

接下来,您可以继续使用;作为delims将它们分割

String tokens[] = text.split(";"); 
+0

在CEDICT - OP所使用的字典中 - 最多可以有16个/定义/(最后一个计数):/one/two/.../所以正则表达式需要将它们全部捕获。 – dda 2012-05-29 06:05:06

0

正则表达式模式是强制T A稍微更复杂,因为有经常在CEDICT几个定义:

矮小 矮小 [ai3 xiao3] /short and small/low and small/undersized/ 

所以,正则表达式是:

^(\S+)\s+(\S+)\s+\[[^]]+\]\s+(/[^/\r]*){1,19}/$