Go,正则表达式:非常具有挑战性的角色正则表达式

时间:2013-11-07 17:39:55

标签: regex unicode character-encoding go

你认为只有正则表达式才有可能吗?

这是我在Go Playground上的尝试

这对于一些脏代码

是成功的

http://play.golang.org/p/YysZCB3vlu

我想要将扩展的韩文字符转换为完整的字母。 例如,“ㅈㅗㅎㅇㄴㄱㅏㅂㅅㅇㅣㅇㅛㅇㅇㅛㅇㅣㅁㅇㅏㄴㄴㅕㅇㅎㅏㅅㅔㅇㅛㅔㅔ”到좋은값이싸요아침안녕세세세세세웬/ / /

  

对于不能正确呈现韩国字符的浏览器:

     
    

좋은값이싸요아침안녕하세요웬

  

简单的部分是韩语字母只能以One Consonant + One或Two元音开头。这可以用(.([ㅏ-ㅣ])+)来抓住。

具有挑战性的部分是跟随元音的零或一个或最多两个可选辅音。难以理解的另一个原因是,在最多两个可选辅音后,我们有另一个不属于前一个字母的辅音,这个辅音意味着新一个字母的另一个开头。

如下所示:

ㄱㅏㅂㅅㅇㅣ
= ㄱㅏㅂㅅ  +  ㅇㅣ
= 값 + 이
= 값이

可以使用if-condition和basic regex捕获所有模式。但如果我的版本较短,那就好了。

我的最终目标是将“ㅈㅗㅎㅇㄴㄱㅏㅂㅅㅇㅣㅆㅏㅇㅛㅇㅏㅊㅣㅁㅇㅏㄴㄴㅕㅇㅎㅏㅅㅔㅇㅛㅔㄴconvert”转换为좋은값이싸요아침안녕하세요웬

  

对于不能正确呈现韩国字符的浏览器:

     
    

좋은값이싸요아침안녕하세요웬

  

1 个答案:

答案 0 :(得分:1)

我不懂韩语,但听起来你可能的输入组合是:

C(Consonant) V(Vowel)
CVV
CVVC
CVVCC
CVC
CVCC

所以捕获它的正则表达式规则(没有捕获下一个单词的第一个辅音)是: CV{1,2}C{0,2}(?!V)

然后您只需要定义C和V字符类,例如将V替换为[ㅏ-ㅣ]

使用您的程序遍历字符串中找到的匹配项,并输出组合词

编辑:Go不支持负向前瞻,所以我建议做以下事情:

  1. 反转字符串(类似于How to reverse a string in Go?,但要注意unicode字节序列)
  2. C{0,2}V{1,2}C
  3. 上运行匹配
  4. 反转每个匹配并执行单词join / lookup
  5. 还有其他方法可以解决缺乏负面预测的问题,但它可能会涉及更多代码来操纵下一个匹配将在输入字符串中开始的位置。

    另外,在定义你要查找的元组字符为元音或辅音时,最好使用unicode转义序列而不是韩语字形本身(通常,例如\x1161),但我我不确定Go是否支持正则表达式中的unicode引用...