为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Cats萌萌 2021-06-30 09:01:51
你认为只有使用正则表达式才有可能吗?这是我在 Go Playground 上的尝试这是成功的一些脏代码http://play.golang.org/p/YysZCB3vlu我想将扩展的韩文字符转换为完整的字母。例如, “ㅈㅗㅎㅇㅡㄴㄱㅏㅂㅅㅇㅣㅆㅏㅇㅛㅇㅏㅊㅣㅁㅇㅏㄴㄴㅕㅇㅎㅏㅅㅔㅇㅛㅇㅜㅔ” 到좋은값이싸요아침안녕하세요웬对于无法正确呈现韩文字符的浏览器:좋 은 값 이 싸 요 아 침 안 녕 하 세 요 웬简单的部分是韩语字母只能以一个辅音+一个或两个元音开头。这可以用 ( .([ㅏ-ㅣ])+)来捕捉。具有挑战性的部分是元音后面的零个或一个或最多两个可选辅音。难的另一个原因是,在最多两个可选辅音之后,我们还有另一个不属于前一个字母的辅音,这个辅音意味着另一个新字母的开始。像下面这样:ㄱㅏㅂㅅㅇㅣ= ㄱㅏㅂㅅ  +  ㅇㅣ= 값 + 이= 값이可以使用 if 条件和基本正则表达式捕获所有模式。但如果我有更短的版本就好了。我的最终目标是转换 “ㅈㅗㅎㅇㅡㄴㄱㅏㅂㅅㅇㅣㅆㅏㅇㅛㅇㅏㅊㅣㅁㅇㅏㄴㄴㅕㅇㅎㅏㅅㅔㅇㅛㅇㅜㅔㄴ” 到좋은값이싸요아침안녕하세요웬对于无法正确呈现韩文字符的浏览器:좋 은 값 이 싸 요 아 침 안 녕 하 세 요 웬
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

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


C(Consonant) V(Vowel)

CVV

CVVC

CVVCC

CVC

CVCC

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


然后你只需要定义你的 C 和 V 字符类,比如用 [ㅏ-ㅣ]


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


编辑:Go 不支持负前瞻,因此我建议执行以下操作:

  1. 反转字符串(类似于How to reverse a string in Go?,但要小心 unicode 字节序列)

  2. 进行比赛 C{0,2}V{1,2}C

  3. 反转每个匹配并执行单词 join/lookup

还有其他方法可以解决缺少负前瞻的问题,但它可能会涉及更多代码来操纵下一个匹配项在输入字符串中的开始位置。

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


查看完整回答
反对 回复 2021-07-05
  • 1 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信