2013-12-23 3 views
6

올바른 핀인 (예 : "sheng", "sou"("병음", "sei"와 같은 잘못된 병음을 무시하면서)과 정확하게 일치 할 수있는 정규 표현식을 찾고 있습니다. 대부분의 정규 표현식 일부 Google 검색 결과에서 잘못된 병음과 일치합니다.정규식 일치를위한 정규식

분명히 어떤 접근 방식이든 상관없이, 이것은 괴물 정규식이 될 것이고, 나는이 문제를 해결하기 위해 취할 수있는 다양한 접근 방식에 특히 관심이 있습니다. .. 예를 들어, "Optimizing a regular expression to parse chinese pinyin는"전환 확인을 사용

유효 병음의 테이블은 여기에서 찾을 수 있습니다 : http://pinyin.info/rules/initials_finals.html

+0

"sou"는 유효하고 유효하지 않습니다. – mareoraft

+0

좋은 캐치. "Sou"가 유효하므로 두 번째 것을 "sei"로 변경했습니다. 이는 잘못된 병음입니다. – stevendaniels

+0

큰 질문입니다. 실용적인 응용 프로그램의 경우 룩업 테이블은 정규식에 비해 몇 가지 장점이 있습니다. –

답변

7

나는 pinyin의 초기 (일반적으로 첫 글자)에 의해 작은 정규 표현을 그룹화 한 정규 표현식에 갔다. 따라서 첫 번째 그룹에는 "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

흠 어떤 이유로 나는 "shi", "zhi", "zi", "si"등과 일치시키지 못하는 것 같습니까? – redshift5

+1

누락 된 "i"정규식을 포함하도록 식을 수정했습니다. https://www.debuggex.com/r/JG_eVfJIoxGtkmQ_ – redshift5

+0

감사합니다. 내가 말했듯이, 편집하기 쉽습니다! – stevendaniels

2

나는 전적으로 정규식이 아닌 조합 방식을 사용합니다. 유효 병음에 대한

확인 :만큼 그들은 자음과 마찬가지로

  • 잡아 글자 단어의 처음부터

    1. 잡아 단어입니다. 이렇게하면 초기 사운드와 최종 사운드가 분리됩니다. 그들의 조합이 허용되는 경우 초기 및 최종이 유효한지

    2. 체크 ...

    3. ... 그래서 경우는, 볼 (this 같은 테이블을 통해,하지만 항목은 단순히 1과 0이다) .