2013-12-23 3 views
6

Я ищу регулярное выражение, которое может правильно соответствовать действительному пиньину (например, «sheng», «sou» (при игнорировании недействительного пиньинь, например «shong», «sei»). Большинство регулярных выражений при условии, что в большинстве случаев результаты поиска в Google не совпадают с недействительным пиньином в некоторых случаях.Regex for Matching Pinyin

Очевидно, что независимо от того, какой подход требуется, это будет регулярное выражение монстра, и меня особенно интересуют различные подходы, которые можно было бы решить для решения этой проблемы .. К примеру, «Optimizing a regular expression to parse chinese pinyin» использует lookbacks

таблица действительного пиньинь можно найти здесь: http://pinyin.info/rules/initials_finals.html

+0

Вы говорите, что «су» является действительным и недействительным. – mareoraft

+0

Хороший улов. «Sou» действительно, поэтому я изменил второй на «sei», что является недействительным пиньинь. – stevendaniels

+0

Большой вопрос. Для практических приложений таблица поиска имеет несколько преимуществ перед регулярным выражением. –

ответ

7

Я пошел для регулярного выражения, которое сгруппировало меньшие регулярные выражения с помощью первоначального пиньинь (обычно первой буквы). Итак, первая группа включает в себя все звуки «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 Я создал.

Regular expression visualization

+0

Хм по какой-то причине я не могу заставить его соответствовать «ши», «zhi», «zi», «si» и т. Д.? – redshift5

+1

Я изменил ваше выражение, включив в него отсутствующие «i» матчи: https://www.debuggex.com/r/JG_eVfJIoxGtkmQ_ – redshift5

+0

Спасибо. Как я уже сказал, легче редактировать! – stevendaniels

2

Я хотел бы использовать комбинированный подход, который является не только регулярным выражением.

Проверьте наличие действительного пиньинь:

  1. захватить слово

  2. захватить письма от начала слова до тех пор, как они согласные. Это отделяет исходный звук от финального звука.

  3. проверить, что начальная и конечная справедливы ...

  4. ... и если да, то ли их сочетание разрешено (с помощью таблицы, как this, но записи просто 1 и 0) ,