netsmu 发表于 2013-11-16 14:08:20

检测字符串是否双拼,三拼等。

比如检查某个网址是不是双拼或三拼,
例如www.baidu.com就是由bai,du,双拼组成的。
www.woaini.comwo,ai,ni 三拼组成。
目前有几千个网址,要怎么检测呢。

user3000 发表于 2013-11-16 18:18:14

可以根据汉字拼音的规律用正则检测。
代码只提供大概思路,请自行完善。Local $str = 'www.baidu.com'
Local $str2 = 'woaini.com'
MsgBox(0, $str, _get_Domain_PY_counts($str))
MsgBox(0, $str2, _get_Domain_PY_counts($str2))

Func _get_Domain_PY_counts($sDomain)
        If Not StringInStr($sDomain, '.') Then Return SetError(1, '', 0)
        Local $aArray
        Local $pattern = '((?:{0,2}){1,2}(?:{0,2}))'
        If StringInStr($sDomain, 'www') Then
           $sDomain = StringRegExpReplace($sDomain, 'www\.(\w+)\..+', '\1')
    Else
           $sDomain = StringRegExpReplace($sDomain, '\..+', '')
    EndIf
        $aArray = StringRegExp($sDomain, $pattern, 3)
        Return UBound($aArray)
EndFunc

netsmu 发表于 2013-11-16 20:46:52

回复 2# user3000


大哥,你太牛了。一个正则就搞定了。我想了一整天,用了很多方法,最后是做出来了,不过使用好几个FOR循环,然后用拼音字库才搞定的。速度慢得要死,1分钟只能检测200多条记录。你这个正则1分钟估计几千条没问题啊。 太牛了,帮到我大忙了。感谢啊。

netsmu 发表于 2013-11-16 21:08:51

回复 2# user3000


   这个判断拼音的正则还是有点问题,比如 字符串"lawegkjwlgekjls"这个也检测出是拼音了。
正则匹配后变成拼音 la,weg,lge,这样了。

netsmu 发表于 2013-11-16 21:23:39

woaini用你那正则 ((?:{0,2}){1,2}(?:{0,2})) 匹配后变成
woa,in,i 了

user3000 发表于 2013-11-17 00:19:04

回复 5# netsmu

我拼音其实不怎么过关,打字也是用的五笔!
确实,拼音不存在“we"之类;所以正则表达式还得完善。
可能要按所有韵母来细分表达式?

还是2楼所说的,”只提供大概思路“!

netegg 发表于 2013-11-17 06:46:48

本帖最后由 netegg 于 2013-11-17 06:47 编辑

按元音拆呢,只是个想法,可能也不大方便

netsmu 发表于 2013-11-17 10:10:48

期待正则高手,能来个拼音的匹配啊。。。。。

kevinch 发表于 2013-11-17 10:59:04

不知道怎么形容啦,这样试下呢$str = 'www.baidu.com'
$str2 = 'woaini.com'
$str3='lawegkjwlgekjls'
ConsoleWrite(test($str)&@CRLF)
ConsoleWrite(test($str2)&@CRLF)
ConsoleWrite(test($str3)&@CRLF)

Func test($sDomain)
        Local $pattern = '(?ms)(((z|c|s)h?|b|p|m|f|d|t|n|l|g|k|h|j|q|x|r|y|w)?((o|i|e|a)ng|(v|u|e|a|i)n|er|ve|i(e|i)|ou|ao|(u|e|a)i|v|u|i|e|o|a))'
        Return StringRegExpReplace(StringRegExpReplace($sDomain,$pattern," $1 "),"(^ +)|(?<= )( +)","")
EndFunc

netsmu 发表于 2013-11-21 14:07:43

楼上的正则也不全,没有办法完全检测出拼音。

天芯蓝影 发表于 2013-11-21 16:35:11

回复 10# netsmu

正则不太行啊,还是弄多个FOR循环之类的吧,正则表达式列举下来起码几百长度,也影响执行效率的,关键是效果也一般

反感和方案这种区分也很难= =

zch11230 发表于 2013-11-21 19:49:09

那就把所有的拼音都列出来嘛。。。。
在这里找的http://xh.5156edu.com/pinyi.html 删掉了一个单m 有单m这个拼音么?
不要看长 正则本身的效率还是不错的 1万组chuangqianmingyueguang也就100多毫秒#AutoIt3Wrapper_UseX64=n
#include <array.au3>
Local $pattern="chuang|shuang|zhuang|chang|cheng|chong|chuai|chuan|guang|huang|jiang|jiong|kuang|liang|niang|qiang|qiong|shang|sheng|shuai|shuan|xiang|xiong|zhang|zheng|zhong|zhuai|zhuan|bang|beng|bian|biao|bing|cang|ceng|chai|chan|chao|chen|chou|chua|chui|chun|chuo|cong|cuan|dang|deng|dian|diao|ding|dong|duan|fang|feng|gang|geng|gong|guai|guan|hang|heng|hong|huai|huan|jian|jiao|jing|juan|kang|keng|kong|kuai|kuan|lang|leng|lian|liao|ling|long|luan|mang|meng|mian|miao|ming|nang|neng|nian|niao|ning|nong|nuan|pang|peng|pian|piao|ping|qian|qiao|qing|quan|rang|reng|rong|ruan|sang|seng|shai|shan|shao|shei|shen|shou|shua|shui|shun|shuo|song|suan|tang|teng|tian|tiao|ting|tong|tuan|wang|weng|xian|xiao|xing|xuan|yang|ying|yong|yuan|zang|zeng|zhai|zhan|zhao|zhei|zhen|zhou|zhua|zhui|zhun|zhuo|zong|zuan|ang|bai|ban|bao|bei|ben|bie|bin|cai|can|cao|cen|cha|che|chi|chu|cou|cui|cun|cuo|dai|dan|dao|den|dei|dia|die|diu|dou|dui|dun|duo|eng|fan|fei|fen|fou|gai|gan|gao|gei|gen|gou|gua|gui|gun|guo|hai|han|hao|hei|hen|hou|hua|hui|hun|huo|jia|jie|jin|jiu|jue|jun|kai|kan|kao|ken|kou|kua|kui|kun|kuo|lai|lan|lao|lei|lia|lie|lin|liu|lou|lue|lve|lun|luo|mai|man|mao|mei|men|mie|min|miu|mou|nai|nan|nao|nei|nen|nie|nin|niu|nou|nve|nuo|nun|pai|pan|pao|pei|pen|pie|pin|pou|qia|qie|qin|qiu|que|qun|ran|rao|ren|rou|rui|run|ruo|sai|san|sao|sen|sha|she|shi|shu|sou|sui|sun|suo|tai|tan|tao|tie|tou|tui|tun|tuo|wai|wan|wei|wen|xia|xie|xin|xiu|xue|xun|yan|yao|yin|you|yue|yun|zai|zan|zao|zei|zen|zha|zhe|zhi|zhu|zou|zui|zun|zuo|ai|an|ao|ba|bi|bo|bu|ca|ce|ci|cu|da|de|di|du|ei|en|er|fa|fo|fu|ga|ge|gu|ha|he|hu|ji|ju|ka|ke|ku|la|le|li|lu|lv|ma|me|mi|mo|mu|na|ne|ng|ni|nu|nv|ou|pa|pi|po|pu|qi|qu|re|ri|ru|sa|se|si|su|ta|te|ti|tu|wa|wo|wu|xi|xu|ya|ye|yi|yo|yu|za|ze|zi|zu|a|e|o|\S"
$array=StringRegExp("chuangqianmingyueguang",$pattern,3)
_ArrayDisplay($array,UBound($array))
$array=StringRegExp("lawegkjwlgekjls",$pattern,3)
_ArrayDisplay($array,UBound($array))
$array=StringRegExp("woaini",$pattern,3)
_ArrayDisplay($array,UBound($array))

wInkly_cc 发表于 2013-12-9 18:33:08

本帖最后由 wInkly_cc 于 2013-12-9 18:34 编辑

那就把所有的拼音都列出来嘛。。。。
在这里找的 删掉了一个单m 有单m这个拼音么?
不要看长 正则本身的效 ...
zch11230 发表于 2013-11-21 19:49 http://www.autoitx.com/images/common/back.gif


    正则:"an|chang"测试"changchangchang"结果是“an,an,an”


不过细看了下,没有后者包含前者的。但是没留意部分包含

kevinch 发表于 2013-12-9 19:31:52

回复 13# wInkly_cc
把被包含的放在后面试下, chang|an

zch11230 发表于 2013-12-9 20:12:23

回复 13# wInkly_cc

很明显要把长的放前面 我都是故意排了序的但是如果像 xian这种 你想拆分为西安 而不是仙的话 那就只有把表达式里面的xian|给删掉。
    如果要加入表达式里面没有的拼音也得是几位数的字母就插入到相应的位置去。
页: [1]
查看完整版本: 检测字符串是否双拼,三拼等。