Регулярное выражение для соответствия пиньинь
Я ищу регулярное выражение, которое может правильно соответствовать действующему пиньинь (например, "sheng", "sou" (игнорируя недопустимый пиньинь, например, "shong", "sei"). Большинство регулярных выражений, представленных в верхних результатах поиска Google, соответствуют недействительный пиньинь в некоторых случаях.
Очевидно, что независимо от того, какой подход вы выберете, это будет регулярное выражение, и меня особенно интересуют различные подходы, которые можно использовать для решения этой проблемы. Например, " Оптимизация регулярного выражения для анализа китайского пиньинь" использует обратные связи.
Таблицу действительных пиньинь можно найти здесь: http://pinyin.info/rules/initials_finals.html
2 ответа
Я выбрал регулярное выражение, которое сгруппировало меньшие регулярные выражения по инициалу пиньинь (обычно первая буква). Итак, первая группа включает в себя все звуки "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, который я создал.
Я бы использовал комбинированный подход, который не является исключительно регулярным выражением.
Проверьте действительный пиньинь:
хватай слово
хватайте буквы в начале слова, если они согласные. Это отделяет начальный звук от окончательного звука.
проверьте правильность начального и конечного...
... и если да, посмотрите, разрешена ли их комбинация (с помощью таблицы, подобной этой, но записи просто 1 и 0).