【问题标题】:Go, Regular Expression : very challenging regex on CharactersGo,正则表达式:非常具有挑战性的字符正则表达式
【发布时间】:2013-11-19 12:09:49
【问题描述】:

你认为只有 Regex 才有可能吗?

这是我在 Go Playground 上的尝试

用一些脏代码就成功了

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

我希望将扩展的韩语字符转换为完整的字母。 例如,“ㅈㅗㅈㅗㅎㅇㅡㅡㄴㄱㅂㅅㅇㅣㅆㅏㅇㅛㅇㅏㅊㅣㅁㅇㄴㄴㅕㅇㅎㅎㅏㅛㅇㅜㅔㅜㅔ값ㅛㅜㅔㅜㅔto이싸요값싸요싸요싸요싸요안녕안녕하세요하세요하세요하세요하세요하세요하세요하세요하세요안녕하세요하세요웬안녕웬웬안녕안녕안녕안녕싸요안녕안녕안녕

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

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

简单的部分是韩文字母只能以一个辅音+一或两个元音开头。这可以通过 (.([ㅏ-ㅣ])+) 捕获。

具有挑战性的部分是元音后面的零个或一个或最多两个可选辅音。难的另一个原因是,在最多两个可选辅音之后,我们还有另一个不属于前一个字母的辅音,而这个辅音意味着另一个新字母的开始。

如下:

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

可以使用 if 条件和基本正则表达式捕获所有模式。但如果我有更短的版本就好了。

我的终极目标是转换“ㅈㅗㅎㅇㅡㄴㄱㅏㅅㅇㅣㅆㅏㅛㅏㅊㅣㅁㅇㅏㄴㅕㅎㅏㅅㅔㅇㅜㅔㄴㅔㄴㅅ싸요값ㅔㄴ값싸요싸요싸요웬하세요웬웬

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

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

【问题讨论】:

标签: regex unicode character-encoding go


【解决方案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. 反转每个匹配并执行单词连接/查找

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

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2013-02-19
相关资源
最近更新 更多