您当前的位置:首页 > 互联网教程

正则匹配的中文包括中文标点符号吗

发布时间:2025-05-19 17:27:33    发布人:远客网络

正则匹配的中文包括中文标点符号吗

一、正则匹配的中文包括中文标点符号吗

不一定的,需要依表达式范围而定,例如:[\u4e00-\u9fa5]可以识别出任何汉字,但不包含如:\u3002(匹配中文句号)。

“[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]”该表达式可以识别出:。;,:“”()、?《》这些标点符号。正则表达式“\un”匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。

正则表达式匹配中文汉字 [\u4e00-\u9fa5],该表达式可以识别出任何汉字。但上述 \u3002等匹配的符号不在范围内。

1、匹配双字节字符(包括汉字在内):[^\x00-\xff],注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

2、只含有汉字、数字、字母、下划线,下划线位置不限:^[a-zA-Z0-9_\u4e00-\u9fa5]+$

3、/^([\p{Han}\p{P}A-Za-z0-9])*$/u,其中 \p{Han}表示utf-8编码中的所有中文字符,\p{P}表示中英文标点,A-Z表示大写字母,a-z表示小写英文字母,0-9表示数字,*表示>=0,,/u表示按unicode(utf-8)匹配(主要针对多字节比如汉字)。

参考资料来源:百度百科-正则表达式

二、验证中文正则表达式怎么写

1、[0-9]+[a-zA-Z]+[0-9a-zA-Z]*|[a-zA-Z]+[0-9]+[0-9a-zA-Z]*

2、①至少一个数字开头,接着至少一个字母,后面无论是数字还是字母都可以。

3、②至少一个字母开头,接着至少一个数字,后面无论是数字还是字母都可以。

4、补充说明:虽然有些环境使用\d或[:digit:]之类的形式可以表示数字,或者其它的特定的形式所对应的特定字符集,但是这样表示并不是通用的;因此建议使用通用的方式来写正则表达式,如[0-9]表示数字,[a-zA-Z]表示大小写字母等。当然,对于特定的编程语言可能还会涉及到转义字符,届时请注意一下。

三、ORACLE中怎样用正则表达式过滤中文字符

从表里提取汉字,需要考虑字符集,不同的字符集汉字的编码有所不同

这里以GB2312为例,写一函数准确地从表里提取简体汉字.

假设数据库字符集编码是GB2312,环境变量(注册表或其它)的字符集也是GB2312编码

并且保存到表里的汉字也都是GB2312编码的

那么也就是汉字是双字节的,且简体汉字的编码范围是

我们先看一下asciistr函数的定义

Non-ASCII characters are converted to the form\xxxx, where xxxx represents a UTF-16 code unit.

但是这并不表示以"\"开始的字符就是汉字了

这里第5条记录有一个实心的五角星

然后用asciistr函数转换一下试试

SQL> select name,asciistr(name) from test;

------------------------------------------

,啊OO10哈,\554AOO10\54C8

大家好aa/\5927\5BB6\597Daa/

☆大海123\2606\5927\6D77123

我们看到最后一条记录的实心五角星也是"\"开头的

此时我们就不能用asciistr(字段)是否存在"\"来判断是否含有汉字了.

我的函数如下,基本思路是判断字符的编码是否在GB2312规定的汉字编码范围之内

create or replace function get_chinese(p_name in varchar2) return varchar2

v_code varchar2(30000):='';

v_chinese varchar2(4000):='';

select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:','') into v_code from dual where rownum=1;

for i in 1..length(p_name) loop

if lengthb(substr(p_name,i,1))=2 then

v_comma:= instrb(v_code,',');

v_code_q:= to_number(substrb(v_code,1,v_comma-1));

v_code_w:= to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));

if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then

v_chinese:= v_chinese||substr(p_name,i,1);

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

SQL> select name from test where length(get_chinese(name))>0;

2.列出有汉字的记录,并且只列出汉字

SQL> select get_chinese(name) from test where length(get_chinese(name))>0;

---------------------------------------------------------------------------

需要说明的是GB2312共有6763个汉字,即72*94-5=6763

我这里是计算72*94,没有减去那5个,那五个是空的。等查到了再减去

改写这个函数,可以提取非汉字或者汉字

该函数有两个参数,第一个表示要提取的字符串,第二个是1,表示提取汉字,是非1,表示提取非汉字

create or replace function get_chinese

v_code varchar2(30000):='';

v_chinese varchar2(4000):='';

v_non_chinese varchar2(4000):='';

select replace(substrb(dump(p_name,1010),instrb(dump(p_name,1010),'ZHS16GBK:')),'ZHS16GBK:','') into v_code from dual where rownum=1;

for i in 1..length(p_name) loop

if lengthb(substr(p_name,i,1))=2 then

v_comma:= instrb(v_code,',');

v_code_q:= to_number(substrb(v_code,1,v_comma-1));

v_code_w:= to_number(substrb(v_code,v_comma+1,abs(instrb(v_code,',',1,2)-v_comma-1)));

if v_code_q>=176 and v_code_q<=247 and v_code_w>=161 and v_code_w<=254 then

v_chinese:= v_chinese||substr(p_name,i,1);

v_non_chinese:= v_non_chinese||substr(p_name,i,1);

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

v_non_chinese:= v_non_chinese||substr(p_name,i,1);

v_code:= ltrim(v_code,'1234567890');

v_code:= ltrim(v_code,',');

if p_chinese='1' then

SQL> select get_chinese(name,1) from a;

-----------------------------------------

SQL> select get_chinese(name,0) from a;

-----------------------------------------