关于c#提取“混合字符串”首字的问题。
网上很多关于单独提取“汉字”首字母的方法,但是假如这样呢,该怎么实现?比如:“今天I是服了You,let's go!”,希望这句话能提取到的首字母是:JTISFLYLG。就是无论是中文还是英文混合,按照混合的顺序统一提取其首字母。希望高手能给出代码,谢谢!此链接是百度知道一些网友给出的答案,但是没能完整地解决这个问题。
http://zhidao.baidu.com/question/538794591?quesup2&oldq=1 c# 首字,混合字符串 --------------------编程问答-------------------- 首先你可以定义出什么叫做分隔符,或者定义出什么不叫做分隔符。
然后识别一个一个中文字。
然后剩下的(被分隔符和中文字所分隔的),就是单词(World)。
--------------------编程问答-------------------- World --> word
找一本大学“编译原理”的入门书看看,在前几节课就会学到这些。 --------------------编程问答--------------------
--------------------编程问答-------------------- 记得有程序可以先把汉字转成拼音,你再分割吧! --------------------编程问答-------------------- 找一本大学“编译原理”的入门书看看,在前几节课就会学到这些。 --------------------编程问答-------------------- string pattern=@"(?is)([\u4e00-\u9fa5])|([a-z])(?(2)[a-z']*|)"; --------------------编程问答-------------------- 3楼的怎么看不懂? --------------------编程问答-------------------- mark一下,说不定以后会用到
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"|]
补充:.NET技术 , C#