你认为只有正则表达式才有可能吗?
这是我在Go Playground上的尝试
这是成功的一些脏代码
http://play.golang.org/p/YysZCB3vlu
我希望将扩展的韩语字符转换为完整的字母。例如,"조ᄒ으ᄂ가ᄇᄉ이싸요아치ᄆ아ᄂ녀ᄋ하세요우ᅦ" 到 좋은값이싸요아침안녕하세요웬
对于无法正确呈现韩语字符的浏览器:
좋 은 값 이 싸 요 아 침 안 녕 하 세 요 웬
简单的部分是韩语字母只能以一个辅音+一个或两个元音开头。可以用(.([ㅏ-ㅣ])+
)捕获。
具有挑战性的部分是元音后面的零或一个或最多两个可选辅音。困难的另一个原因是,在最多两个可选辅音之后,我们还有另一个不属于前一个字母的辅音,这个辅音意味着一个新的字母的另一个开始。
如下所示:
ㄱㅏㅂㅅㅇㅣ
= ㄱㅏㅂㅅ + ㅇㅣ
= 값 + 이
= 값이
可以使用 if 条件和基本正则表达式捕获所有模式。但是如果我有更短的版本就好了。
我的最终目标是将"조ᄒ으ᄂ가ᄇᄉ이싸요아치ᄆ아ᄂ녀ᄋ하세요우ᅦᄂ"转换为좋은값이싸요아침안녕하세요웬
对于无法正确呈现韩语字符的浏览器:
좋 은 값 이 싸 요 아 침 안 녕 하 세 요 웬
懂韩语,但听起来您可能的输入组合是:
C(Consonant) V(Vowel)
CVV
CVVC
CVVCC
CVC
CVCC
因此,捕获该规则(不捕获下一个单词的第一个辅音)是: CV{1,2}C{0,2}(?!V)
然后你只需要定义你的 C 和 V 字符类,比如用 [ㅏ-ㅣ]
替换 V
使用程序遍历字符串中找到的匹配项,并输出组合的单词
编辑:Go不支持负面展望,所以我建议执行以下操作:
- 反转字符串(类似于如何在 Go 中反转字符串?,但要小心 unicode 字节序列)
- 在
C{0,2}V{1,2}C
上运行匹配 - 反转每个匹配项并执行单词连接/查找
还有其他方法可以解决缺乏负面展望的问题,但它可能涉及更多的代码来操作输入字符串中下一场比赛的开始位置。
此外,在定义您将查找的字符集作为元音或辅音时,最好使用 unicode 转义序列而不是韩语字形本身(通常,例如,x1161
),但我不确定 Go 是否支持正则表达式中的 unicode 引用......