当前位置:编程学习 > C#/ASP.NET >>

关于c#提取“混合字符串”首字的问题。

网上很多关于单独提取“汉字”首字母的方法,但是假如这样呢,该怎么实现?比如:“今天I是服了You,let's go!”,希望这句话能提取到的首字母是:JTISFLYLG。就是无论是中文还是英文混合,按照混合的顺序统一提取其首字母。希望高手能给出代码,谢谢!

此链接是百度知道一些网友给出的答案,但是没能完整地解决这个问题。
http://zhidao.baidu.com/question/538794591?quesup2&oldq=1 c# 首字,混合字符串 --------------------编程问答-------------------- 首先你可以定义出什么叫做分隔符,或者定义出什么不叫做分隔符。

然后识别一个一个中文字。

然后剩下的(被分隔符和中文字所分隔的),就是单词(World)。

--------------------编程问答-------------------- World  -->  word


找一本大学“编译原理”的入门书看看,在前几节课就会学到这些。 --------------------编程问答--------------------

open Microsoft.International.Converters.PinYinConverter

//有效单词连接符,如:Let's
//有一些如:Auto-Completion 一般认为是两个单词,如果需要作为一个单词看待,在数组中加上 '-'
let effConn = [| ''' |]

//将每个字的首字母(多音字时可能有多个)拼接起来
let rec getAllCase i (arrss:string array array) (result:string array) =
    if i = arrss.Length then result else
    if result.Length = 0 then arrss.[i]
    else [| for a in result do for b in arrss.[i] do yield a + b |]
    |> getAllCase (i+1) arrss
    
let getPinYin (str:string) =
    //是否是中文
    let isCn a = ChineseChar.IsValidChar(a)
    //是否是英文
    let isEn a = (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z')
    //是否是连接符
    let isConn a = effConn |> Array.exists (fun x -> x = a)

    //可能的首字母列表,多个字,每个字可能是多音字,所以类型是数组的数组
    let mybeList =
        str.ToCharArray()
        |> Array.mapi (fun i a -> //遍历每个字符
            match a with
            | a when isCn a -> //该字符是中文
                ChineseChar(a).Pinyins //获取它的所有拼音(多音字时多个拼音)
                |> Seq.filter (fun x -> x <> null) //Pinyins是长度为8的数组,这里过滤掉null的发音
                |> Seq.map (fun x -> x.Substring(0, 1)) //每个拼音只取首字母
                |> Seq.distinct //即使多音字,首字母也可能相同,这里取不重复的
                |> Seq.toArray
            //不是符号
            //在字符串的第一位时认为是首字母
            //前面是中文时认为是首字母
            //前面不是英文和连接符时认为是首字母
            | a when isEn a && (i = 0 || (i > 0 && (isCn str.[i-1] || (isEn str.[i-1] = false && isConn str.[i-1] = false)))) -> [|string(a).ToUpper()|]
            //除以上情况,没有首字母
            | _ -> Array.empty
        )
        |> Array.filter (fun x -> x.Length > 0) //过滤掉首字母为空的

    //生成结果
    getAllCase 0 mybeList [||]


getPinYin "今天I是服了You,let's go!" |> printfn "%A" //[|"JTISFLYLG"|]
getPinYin "长度" |> printfn "%A" //[|"CD"; "ZD"|],"长"可念"Chang"和"Zhang","度"的多音都是以D开头("du"和"duo")
getPinYin "<Hello /world}dotnet" |> printfn "%A" //[|"HWD"|]
--------------------编程问答-------------------- 记得有程序可以先把汉字转成拼音,你再分割吧! --------------------编程问答-------------------- 找一本大学“编译原理”的入门书看看,在前几节课就会学到这些。  --------------------编程问答-------------------- string pattern=@"(?is)([\u4e00-\u9fa5])|([a-z])(?(2)[a-z']*|)"; --------------------编程问答-------------------- 3楼的怎么看不懂? --------------------编程问答-------------------- mark一下,说不定以后会用到
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,