在日常编程中,我们经常会遇到一些简单的字符串匹配问题,但是需要取回匹配的字符串,例如:“电话号码:+86-512-66668888”,我们希望把它匹配成国际区号=86,本地区号=512,电话号码=66668888,在这种简单规则的情况下,并不需要使用正则表达式。本文描述如何实现此简单算法。
由于我们只是实现简单的匹配规则,所以,我们只是用”?”代表一个字符,用“*”代表多个字符,做简单匹配,但是,由于我们不仅要测试是否匹配,还需要取回匹配的字符串值,这样,就需要把变量地址放入规则字符串,用“^”放在变量地址的头和尾,作为标记。在上例中,规则字符串表示为:“*:+^addr1^-^addr2^-^addr3^”,其中addri=IntToStr(longint(addr(变量i))).
从上述描述中,我们也看到,这个简单算法并不处理多次匹配,也可称之为文本的行匹配算法。
那么如何实现呢?
1. 我们将规则字符串(strRule)和需要匹配的字符串(strToBeMatched)采用指针方式存储。
2. 指针iStrRule指向规则字符串的正在匹配的字符,jStrTBM指向需要匹配的字符串的匹配的字符,iStarStart规则字符串的多字符匹配的第一个字符,jStarStart指向需要匹配的字符串的多字符匹配时的第一个字符。就jAddrStart用于保存变量匹配时的需要匹配的字符串的第一个字符。
3. 分别处理规则字符串中*,?,^的情况和其他情况,设置变量isStar和isAddr来标记现在是否是多字符匹配和变量匹配。
4. 需要处理的其他情况是:
1)处理多字符匹配和变量匹配时的回退。
2)处理iStrRule指向字符串末尾时的情况。
3)处理jStrTBM指向字符串末尾时的情况。
详细的实现,请见附件。
本文描述了如何处理简单规则的字符串匹配,并返回匹配的字符串,例如:“电话号码:+86-512-66668888”,我们希望匹配成功时,返回:国际区号=86,本地区号=512,电话号码=66668888。如有疑问,欢迎和我联系:TigerII@vip.sina.com
本文出自 “NothingImpossible” 博客,请务必保留此出处http://tigerii.blog.51cto.com/934085/203278