【问题标题】:Regex for Matching Pinyin匹配拼音的正则表达式
【发布时间】:2014-01-11 05:51:32
【问题描述】:

我正在寻找可以正确匹配有效拼音的正则表达式(例如“sheng”、“sou”(同时忽略无效的拼音,例如“shong”、“sei”)。顶部提供的大多数正则表达式在某些情况下,Google 结果匹配无效的拼音。

显然,无论采取什么方法,这将是一个怪物正则表达式,我对解决这个问题可以采取的不同方法特别感兴趣。例如,“Optimizing a regular expression to parse chinese pinyin”使用回溯。

可在此处找到有效拼音表: http://pinyin.info/rules/initials_finals.html

【问题讨论】:

  • 你说“sou”既有效又无效。
  • 不错的收获。 “Sou”有效,所以我把第二个改成“sei”,拼音无效。
  • 好问题。对于实际应用,查找表比正则表达式有几个优点。
  • 一个真正懒惰的蛮力解决方案是采用column 6 "Hanyu Pinyin" (or another column depending on your needs) from here,然后将每个元音替换为其自身及其音调重音(例如a → [aāáǎà])。这将包括一些误报(例如,yào 有效,但 yaò 无效)。然后用| 分隔音节,瞧!
  • 对于重音拼音,粗略和模糊的方法是使用.*[ĀāÁáǍǎÀàĒēÉéĚěÈèĪīÍíǏǐÌìŌōÓóǑǒÒòŪūÚúǓǔÙùÜüǗǘǙǚǛǜ«»⸢⸣⸤⸥]+.*——当然,这也可以匹配任何非英语字符集,例如德语、法语、匈牙利语等。正确的方法是在应用 stevendaniels' 答案之前,使用字符构建替换地图以预处理数据。

标签: regex cjk


【解决方案1】:

我选择了一个正则表达式,它按拼音的首字母(通常是第一个字母)对较小的正则表达式进行分组。所以,第一组包括所有的“b”、“p”和“m”音,然后是“f”,然后是“d”和“t”,等等。

这种方法似乎易于阅读并且应该易于编辑(如果需要更正或添加)。为了提高可读性,我还为群组的乞讨添加了例外。

([mM]iu|[pmPM]ou|[bpmBPM](o|e(i|ng?)?|a(ng?|i|o)?|i(e|ng?|a[no])?|u))|
([fF](ou?|[ae](ng?|i)?|u))|([dD](e(i|ng?)|i(a[on]?|u))|
[dtDT](a(i|ng?|o)?|e(i|ng)?|i(a[on]?|e|ng|u)?|o(ng?|u)|u(o|i|an?|n)?))|
([nN]eng?|[lnLN](a(i|ng?|o)?|e(i|ng)?|i(ang|a[on]?|e|ng?|u)?|o(ng?|u)|u(o|i|an?|n)?|ve?))|
([ghkGHK](a(i|ng?|o)?|e(i|ng?)?|o(u|ng)|u(a(i|ng?)?|i|n|o)?))|
([zZ]h?ei|[czCZ]h?(e(ng?)?|o(ng?|u)?|ao|u?a(i|ng?)?|u?(o|i|n)?))|
([sS]ong|[sS]hua(i|ng?)?|[sS]hei|[sS][h]?(a(i|ng?|o)?|en?g?|ou|u(a?n|o|i)?|i))|
([rR]([ae]ng?|i|e|ao|ou|ong|u[oin]|ua?n?))|
([jqxJQX](i(a(o|ng?)?|[eu]|ong|ng?)?|u(e|a?n)?))|
(([aA](i|o|ng?)?|[oO]u?|[eE](i|ng?|r)?))|
([wW](a(i|ng?)?|o|e(i|ng?)?|u))|
[yY](a(o|ng?)?|e|in?g?|o(u|ng)?|u(e|a?n)?)

这是我创建的Debuggex example。

【讨论】:

  • 嗯,由于某种原因,我似乎无法匹配“shi”、“zhi”、“zi”、“si”等?
  • 我已经修改了您的表达式以包含缺少的“i”匹配器:debuggex.com/r/JG_eVfJIoxGtkmQ_
  • 添加了大写字母匹配并进行了小修复,使其匹配“er”。
  • 可以使用i标志实现大写匹配
  • 没错,但从技术上讲,大写字母仅对单词的第一个字符有效,并且仅当该单词是专有名词或在句子的开头时才有效。
【解决方案2】:

我会使用不仅仅是正则表达式的组合方法。

检查有效的拼音:

  1. 抢字

  2. 从单词的开头抓取字母,只要它们是辅音。这将初始声音与最终声音分开。

  3. 检查初始和最终是否有效...

  4. ...如果是,请查看是否允许它们的组合(通过 this 之类的表,但条目只是 1 和 0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多