找回密码
 加入
搜索
查看: 9139|回复: 6

[AU3基础] 如何用正则表达式判断文本中包含有汉字?

  [复制链接]
发表于 2011-2-13 17:57:07 | 显示全部楼层 |阅读模式
就是给一段文字,然后用正则表达式判断这段文字中是否包含有汉字,搜索了不少,都没有找到合适的,希望有人能支招。目前搜到的几种方法:
1)# [\u2E80-\u9FFF]+$    匹配所有东亚区的语言   
# [\u4E00-\u9FFF]+$     匹配简体和繁体   
# [\u4E00-\u9FA5]+$     匹配简体  
AutoIt里好像不支持\u这种方法,再说也匹配不成功啊。

2) [^\x00-\xff]+  问题是所有双字节的东亚文字都算作汉字了,比如日语、韩语等。还有,空格也算了

希望有简体、繁体的判断方法。
发表于 2011-2-13 21:24:14 | 显示全部楼层
嘿嘿,CJK汉字的Unicode编码有基本集、扩展A集、扩展B集、扩展C集……
并非楼主所说# [\u4E00-\u9FA5]+$     匹配简体  这么简单.
AU3正则也许并不支持\u,仅仅是也许.因为我没有找到并不代表没有这个参数.
#include <array.au3>

Local $str = "阿中A華华b人-民c臺灣共E0和位で表現する文字符号化形式及び文字符号化スキーム。ASCIIに9r国90會館ねちちせのひノセタツヒヌニック"
$abc=_regexp($str,0)
msgbox(0,'单字节',$abc)
$abc=_regexp($str,1)
msgbox(0,'简体中文',$abc)
$abc=_regexp($str,2)
msgbox(0,'非简体双字节字符',$abc)

Func _regexp($input,$flag=1);flag,0='单字节字符',1='简体中文',2='其它双字节字符'
        local $single,$due,$other
        If StringRegExp($input, '[^\x00-\xff]+', 0) Then
                $temp = StringSplit($input, '')
                For $i = 1 To $temp[0]
                        If BinaryLen(StringToBinary($temp[$i])) = 2 Then
                                $high = BinaryMid(StringToBinary($temp[$i]), 1, 1)
                                $low = BinaryMid(StringToBinary($temp[$i]), 2, 1)
                                If $high >= 0xb0 And $high <= 0xf7 And $low >= 0xa1 And $low <= 0xfe Then
                                        $due&=$temp[$i]
                                Else
                                        $other&=$temp[$i]
                                EndIf
                        Elseif BinaryLen(StringToBinary($temp[$i])) =1 Then
                                $single&=$temp[$i]
                        EndIf
                Next
                select
                        case $flag=0 
                                return $single
                        case $flag=1
                                return $due
                        case $flag=2
                                return $other
                EndSelect
        EndIf
EndFunc   ;==>_regexp

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
maker + 20 + 2

查看全部评分

 楼主| 发表于 2011-2-15 11:30:26 | 显示全部楼层
回复 2# 3mile
楼上的代码很好,多谢。
不过你的代码也有一些问题,比如:如果字符串里包含中文符号呢?比如"【。;‘,。、】"。这些字符和非简体中文字符一样啊。
我现在需要判断一个字符串是否是否是【简体中文和各种中文字符】,如果字符串中包含日文、韩文等东亚字符,那这个字符串就不合格,楼上的能帮帮我妈?
发表于 2011-2-15 11:59:11 | 显示全部楼层
回复 3# 只为关注
GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。
GB2312 将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09 区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。

如果要包括符号的话判断会复杂很多,给个简单的办法,将符号全部收录进行判断,但符号中包含了日文假名、俄文字母等双字节字符。
#include <array.au3>
 
Local $str = "阿中A華华b人-民c臺灣共E0和位で表。,、;:?!…—·ˉˇ¨‘’“”々~‖∶"'`|〃〔〕〈〉《》「」『』.〖〗【】()[]{}【。;‘,。、】現する文字符号化形式及び文字符号化スキーム。ASCIIに9r国90會館ねちちせのひノセタツヒヌニック"
$abc=_regexp($str,0)
msgbox(0,'单字节',$abc)
$abc=_regexp($str,1)
msgbox(0,'简体中文',$abc)
$abc=_regexp($str,2)
msgbox(0,'非简体双字节字符',$abc)
 
Func _regexp($input,$flag=1);flag,0='单字节字符',1='简体中文',2='其它双字节字符'
        local $single,$due,$other
        If StringRegExp($input, '[^\x00-\xff]+', 0) Then
                $temp = StringSplit($input, '')
                For $i = 1 To $temp[0]
                        If BinaryLen(StringToBinary($temp[$i])) = 2 Then
                                $high = BinaryMid(StringToBinary($temp[$i]), 1, 1)
                                $low = BinaryMid(StringToBinary($temp[$i]), 2, 1)
                                If ($high >= 0xa1 And $high <= 0xf7 And $low >= 0xa1 And $low <= 0xfe) Then ;_
;~                                        Or ($high>=0xa1 And $high<0xa3 And $low>=0xa1 And $low<=0xfe) Then
                                        $due&=$temp[$i]
                                Else
                                        $other&=$temp[$i]
                                EndIf
                        Elseif BinaryLen(StringToBinary($temp[$i])) =1 Then
                                $single&=$temp[$i]
                        EndIf
                Next
                select
                        case $flag=0 
                                return $single
                        case $flag=1
                                return $due
                        case $flag=2
                                return $other
                EndSelect
        EndIf
EndFunc   ;==>_regexp
 楼主| 发表于 2011-2-15 12:18:11 | 显示全部楼层
回复 4# 3mile
可以在字符串后面加上点韩文做测试:&BinaryToString("0xD55CAD6DC758",3)
不过这样问题更大啊:
简体中文里包含了日文啊。
非简体双字节字符里倒是只剩下繁体字了。
 楼主| 发表于 2011-2-15 12:29:28 | 显示全部楼层
回复 4# 3mile
另外,不能一直用正则来判断吗?用每个字符串判断的方式,数据量小到罢了,像我要复查整个数据库,有几十万条字符串,再拆分成单个字判断,速度太太慢了
发表于 2011-2-15 17:41:00 | 显示全部楼层
[\u4e00-\u9fa5] 可以这样表示 [一-龥]

评分

参与人数 1金钱 +10 收起 理由
3mile + 10 学习了

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 18:42 , Processed in 0.089481 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表