马黑黑 发表于 2021-8-30 21:22

正则表达式匹配汉语拼音的思路

本帖最后由 马黑黑 于 2021-8-31 00:13 编辑

----== 【友情提示】本帖阅读难度:★★★★☆,不过可以保证文内没有偏僻字 ==----

汉语拼音一般有如下两种常规表现形式:① páng,② pang2 。现仅就这两种情形讨论正则表达式的匹配构建,其他的拼音表达方式暂不予以考虑。

一、带声调符号的拼音

先讨论第一种表现形式:带声调符号的拼音,像páng所代表的这一类传统的拼音表现方法。这种结构的拼音,其构成有一个规律,即存在一个带有声调的元音字母,如前面示例中的ā即是。元音字母是构成声母的最小单位,声调就标在其上。因此可以先定义一个概念以便方便随后的讨论——“韵母基本符号”:英文元音字母aeiou外加输入法记作v的ü,凡六个,是汉语拼音中最基本的韵母符号,称为韵母基本符号。

根据1996年颁布实施的《汉语拼音正词基本规则》(国家标准)“声调一律标原调,不标变调”之规定,我们视每一个汉语拼音组合都可能存在四个声调,那么一共有 6*4=24 个带声调的拼音符号,它们是:

āáǎà ōóǒò ēéěè īíǐì ūúǔù ǖǘǚǜ

如前已述,韵母基本符号是每一个拼音组合的核心。这意味着此类符号是判断一个字母组合是拼音与否的关键所在。例如,can和cǎn,前者是英语单词,后者是汉语拼音,判断依据之一就是带不带有连着声调的韵母基本符号。

韵母基本符号有的可以本体就是一个拼音组合,同时又可以和其他的字母组合成双韵母、多韵母,这些独自的和组合的韵母和声母一道,或可以单独地、或又和其他字母一起,组成一个个有效的单位,这便是基于汉字的拼音组合。由此可以理解,拼音组合,以ā为例,可能以如下三种方式组合成一个个完整的汉字拼音:

ā      阿
ān      安
lā      啦

通过分析可以发现,ā可以:①自成组合成字音;②和其他字母构成新的韵母组合成字音;③跟在声母后面构成拼音组合成字音。所以,ā之前、之后在可能存在的组合中都可能有其他字母存在,因此给其构建的正则表达式应是这样:

*ā*

式子解释:ā就是ā的自身,没有任何其他约束,它出现就匹配,不出现就不匹配;其前、其后各有子式子*,其中,表示所有的大小写字母,*表示这些字母中的任意一个出现零次或多次。

这样,这个表达式就能极好地描述了ā、ān、lā的存在。不幸的是,连着写的拼音流可能不会严格按照两个组合之间用空格或分隔符(')隔开的书写规范,若此,上面构建的正则表达式仍然可以匹配它们,那是因为式子里对大小写字母的限定用了 * 号,支持周边元素的零出现;但可以不用太在意,毕竟不是拼音的拼音流有N多个韵母基本符号在里面,本质上它们也是拼音(流)。下面展示可能的拼音流语句,前两种是正常的、可按“单词”形态匹配的,第三种是不规范但也能整体匹配的(视为一个“单词”)——

①规范:wǒ ài nǐ ā
②规范:wǒ'ài'nǐ'ā
③错误:wǒàinǐā

把匹配了ā组合的式子改造一下,即将ā扩充为所有的韵母基本符号集群(置于中括号里),则可较为完美地构建能够匹配文档中所有规范书写的汉语拼音组合和汉语拼音流:

*[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜ]*

二、带数字声调的拼音

这一类拼音表现形式,例如pang2所展现的,其结构较为简单:一个字母组合+一个数字。试看——

a1      阿
ang2      昂
lan3      懒
liang4      量

字母组合可以是单个成字音,也可以是多个成字音,字母还是英文的26个字母,所以用 + 可以对此进行描述。其中,+ 表示中括号里所描述的大小写字母中任意一个出现一次或多次,换言之,大小写字母只要任意一个出现过一次或多次,或者多个字母出现过一次或多次,都匹配。显然不太严谨,但对检测而言无伤大雅——拼音世界里的真实存在就是这样。

字母组合后面的数字,从1到4必有一个,写成式子:{1},意思是中括号里边的1234任意哪一个都行只要也只能出现一次,1234以外的不被匹配,1234里出现两次的(如13)后一个不被匹配。

字母组合和数字连起来写得出完整式子 +{1},这个表达式能够完美地匹配文档中所有带数字声调的拼音,全部找出文档里的a1、an4和lan3之类的拼音组合。

最后,假设文档中两种书写格式的拼音组合都存在,怎么通过一个式子去匹配它们?这里只要用上正则表达式的“分枝”功能将上面讨论的两个式子组合起来,便能让假设成真:

*[āáǎàōóǒòēéěèīíǐìūúǔùüǖǘǚǜ]*|+{1}

符号“|”是或者的意思,意思是说,一个字串,如果符合 | 左边部分的式子,那就匹配成功,如果不符合,但符合其右边部分的式子,那也匹配成功。

红影 发表于 2021-8-30 21:30

两种标注音调的方式。学习了{:4_187:}

红影 发表于 2021-8-30 21:31

拼音貌似都小写的吧,不需要把大写也算上去吧?

马黑黑 发表于 2021-8-30 21:31

红影 发表于 2021-8-30 21:31
拼音貌似都小写的吧,不需要把大写也算上去吧?

谁说的?拼音语句也要大小写规范的

红影 发表于 2021-8-30 21:45

马黑黑 发表于 2021-8-30 21:31
谁说的?拼音语句也要大小写规范的

哦,这个倒从来没注意过,因为我们习惯用汉字直接表达,而不是用注音来交流。

加林森 发表于 2021-8-30 22:19

学习~~~~~~~~~~~

马黑黑 发表于 2021-8-31 00:06

红影 发表于 2021-8-30 21:45
哦,这个倒从来没注意过,因为我们习惯用汉字直接表达,而不是用注音来交流。

注音是为了辅读

马黑黑 发表于 2021-8-31 00:07

加林森 发表于 2021-8-30 22:19
学习~~~~~~~~~~~

晚上好队长

红影 发表于 2021-8-31 12:23

马黑黑 发表于 2021-8-31 00:06
注音是为了辅读

这个是为了让外国人看的吧,毕竟中国人都认识汉字{:4_173:}

马黑黑 发表于 2021-8-31 12:56

红影 发表于 2021-8-31 12:23
这个是为了让外国人看的吧,毕竟中国人都认识汉字

不是的。小学课程里有的。如,Běi Jīng,Shuàng Hǎi,什么的

红影 发表于 2021-8-31 13:17

马黑黑 发表于 2021-8-31 12:56
不是的。小学课程里有的。如,Běi Jīng,Shuàng Hǎi,什么的

Shuàng Hǎi ,第一个读音不存在吧,应该是Shàng Hǎi

加林森 发表于 2021-8-31 20:13

马黑黑 发表于 2021-8-31 00:07
晚上好队长

晚上好,老黑!

马黑黑 发表于 2021-8-31 22:01

加林森 发表于 2021-8-31 20:13
晚上好,老黑!

队长好

加林森 发表于 2021-8-31 22:04

马黑黑 发表于 2021-8-31 22:01
队长好

嗯嗯,好啊!

马黑黑 发表于 2021-8-31 22:04

加林森 发表于 2021-8-31 22:04
嗯嗯,好啊!

好就好啊

马黑黑 发表于 2021-8-31 22:06

红影 发表于 2021-8-31 13:17
Shuàng Hǎi ,第一个读音不存在吧,应该是Shàng Hǎi

多了个U{:5_106:}

红影 发表于 2021-8-31 23:22

马黑黑 发表于 2021-8-31 22:06
多了个U

哈哈,一下子被我抓到了{:4_173:}

马黑黑 发表于 2021-9-1 13:04

红影 发表于 2021-8-31 23:22
哈哈,一下子被我抓到了

说明眼神和知识都厉害

红影 发表于 2021-9-1 16:18

马黑黑 发表于 2021-9-1 13:04
说明眼神和知识都厉害

只不过说着好玩,你还当真啊{:4_173:}

马黑黑 发表于 2021-9-2 08:33

红影 发表于 2021-9-1 16:18
只不过说着好玩,你还当真啊

纠错方面必须当真
页: [1] 2 3 4 5 6
查看完整版本: 正则表达式匹配汉语拼音的思路