关于找出一个包含中文和英文的字符串中出现次数最多的字,
自己在网上找了各种解决方法,最后总结出了以下4种方法:
我是用PHP实现的,代码直接复制即用。
$str="法律框架go啊放假了ajg昆仑剑法,发 eoi";
//方法一$strlen=mb_strlen($str,"utf-8");//获取中文长度,空格也包括
$arr=array();
for($i=0;$i<$strlen;$i++){
$arr[]= mb_substr($str,$i,1,"utf-8");
}
$newarr=array_count_values($arr);
//统计数组中所有值出现的次数,返回数组
//键名为原数组的键值,键值为出现次数
//rsort($newarr);按照键值大到小排序,键名变成数字0,1..
arsort($newarr);//按照键值大到小排序,键名保存不变
$chararr=array_keys($newarr,Max(array_values($newarr)));//取包含指定值的键名
//$chararr=array_keys($newarr,current($newarr));
//方法二
/*
mb_regex_encoding('UTF-8');
mb_internal_encoding("UTF-8");
function mb_str_split($str){
global $arr;//注意这个地方
$temp=mb_split("(?<!^)(?!$)",$str);
$arr[]=$temp[0];
if(mb_strlen($temp[1],"utf-8")>1){
mb_str_split($temp[1]);
}else{
$arr[]=$temp[1];
}
return $arr;
}
mb_str_split($str);
$newarr=array_count_values($arr);
arsort($newarr);
var_dump($newarr);
*/
//方法三
//$arr=preg_split('//u', $str,null,PREG_SPLIT_NO_EMPTY );
//方法四
//$arr=preg_split('/(?<!^)(?!$)/u', $str,null,PREG_SPLIT_NO_EMPTY );
//$arr=preg_split('/(?<!^)(?!$)/u', $str );
//var_dump($arr);
//(?<!expr)和(?!expr)都是零宽断言,前者表示此位置之前不匹配expr,后者表示此位置之后不匹配expr。
//在正则中^和$单独用表示开头和末尾。
//也就是说(?<!^)表示此位置之前不匹配开头,(?!$)表示此位置之后不匹配末尾。
//所以这个split匹配到的部分,为每两个字的中间位置(但是没有匹配到任何实际的字符)