我正在尋找一個正確的表達式,可以正確匹配有效拼音(例如「sheng」,「sou」(同時忽略無效拼音,例如「shong」,「sei」)大多數正則表達式在頂部Google搜索結果中匹配無效拼音有些情況下, 。例如,「Optimizing a regular expression to parse chinese pinyin」採用回溯期正則表達式匹配拼音
有效拼音的表格可以在這裏找到: http://pinyin.info/rules/initials_finals.html
我正在尋找一個正確的表達式,可以正確匹配有效拼音(例如「sheng」,「sou」(同時忽略無效拼音,例如「shong」,「sei」)大多數正則表達式在頂部Google搜索結果中匹配無效拼音有些情況下, 。例如,「Optimizing a regular expression to parse chinese pinyin」採用回溯期正則表達式匹配拼音
有效拼音的表格可以在這裏找到: http://pinyin.info/rules/initials_finals.html
我去了拼音最初(通常是第一個字母)分組較小正則表達式的正則表達式。這樣,第一組包括所有的「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」等? – redshift5
我修改了您的表達方式,以包含缺少的「我」匹配器:https://www.debuggex.com/r/JG_eVfJIoxGtkmQ_ – redshift5
謝謝。就像我說的那樣,編輯起來更容易! – stevendaniels
我會用相結合的方式,是不是純粹的正則表達式。
檢查有效拼音:
搶字從單詞的開頭
搶字母,只要他們都是輔音字母。這將初始聲音與最終聲音分開。
檢查最初和最後的有效...
...如果是的話,看看他們的組合是允許的(通過表像this,但條目是簡單的1和0) 。
你說「sou」既有效又無效。 – mareoraft
好的。 「Sou」是有效的,所以我把第二個改成了「sei」,這是無效的拼音。 – stevendaniels
偉大的問題。對於實際應用,查找表比正則表達式有幾個優點。 –