2013-12-23 11 views
6

Ich suche nach einem regulären Ausdruck, der korrekt gültiges Pinyin (z. B. "sheng", "sou") entsprechen kann (beim Ignorieren ungültiger Pinyin, zB "shong", "sei") Die in den Google-Suchergebnissen angegebenen Ergebnisse stimmen in einigen Fällen mit dem ungültigen pinyin überein.Regex für passendes Pinyin

Offensichtlich ist dies ein Monster-Regex, egal, welchen Ansatz man wählt, und ich bin besonders an den verschiedenen Ansätzen zur Lösung dieses Problems interessiert .. Zum Beispiel: "Optimizing a regular expression to parse chinese pinyin" verwendet lookbacks

Eine Tabelle gültiger Pinyin ist hier zu finden: http://pinyin.info/rules/initials_finals.html

+0

Sie sagen, dass "sou" sowohl gültig als auch ungültig ist. – mareoraft

+0

Schöner Fang. "Sou" ist gültig, also habe ich den zweiten zu "sei" geändert, was ein ungültiger Pinyin ist. – stevendaniels

+0

Große Frage. Für praktische Anwendungen hat eine Nachschlagetabelle mehrere Vorteile gegenüber einer Regex. –

Antwort

7

Ich ging für eine Regex, die kleinere Regexes durch die Pinyin Anfangs gruppiert (in der Regel der erste Buchstabe). Also, die erste Gruppe enthält alle "b", "p" und "m" Töne, dann "f", dann "d" und "t", usw.

Dieser Ansatz scheint einfach zu lesen und sollte einfach sein zu bearbeiten (wenn es Korrekturen oder Ergänzungen benötigt). Ich habe auch Ausnahmen zum Betteln von Gruppen hinzugefügt, um die Lesbarkeit zu verbessern.

([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)?) 

Hier ist die Debuggex example ich erstellt.

Regular expression visualization

+0

Hmm aus irgendeinem Grund kann ich nicht scheinen, damit es "shi", "zhi", "zi", "si" usw. zusammenbringt? – redshift5

+1

Ich habe Ihren Ausdruck so geändert, dass er die fehlenden "i" -Matchers enthält: https://www.debuggex.com/r/JG_eVfJIoxGtkmQ_ – redshift5

+0

Vielen Dank. Wie ich schon sagte, einfacher zu bearbeiten! – stevendaniels

2

würde ich eine Kombination Ansatz verwenden, der nicht nur regex ist.

prüfen gültig Pinyin:

  1. greifen Wort

  2. greifen Buchstaben vom Anfang des Wortes, solange sie Konsonanten sind. Dies trennt den Anfangston vom letzten Ton.

  3. prüfen, ob die Anfangs- und Abschluss gültig ist ...

  4. ... und wenn ja, ob ihre Kombination erlaubt ist (über einen Tisch wie this, aber die Einträge sind einfach 1 und 0) .