在进行字符串处理时,常常需要提取其中某一类型的字符,有时候需要提取其中的数字,有时需要提取其中的英文字符,而有时候则需要提取其中的中文字符。

这里利用正则匹配,实现了该功能。

废话少说,直接上码:DELIMITER $$

DROP FUNCTION IF EXISTS `Num_char_extract`$$

CREATE FUNCTION `Num_char_extract`(Varstring VARCHAR(100)CHARSET utf8, flag INT) RETURNS VARCHAR(50) CHARSET utf8

BEGIN

DECLARE len INT DEFAULT 0;

DECLARE Tmp VARCHAR(100) DEFAULT '';

SET len=CHAR_LENGTH(Varstring);

IF flag = 0

THEN

WHILE len > 0 DO

IF MID(Varstring,len,1)REGEXP'[0-9]' THEN

SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));

END IF;

SET len = len - 1;

END WHILE;

ELSEIF flag=1

THEN

WHILE len > 0 DO

IF (MID(Varstring,len,1)REGEXP '[a-zA-Z]')

THEN

SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));

END IF;

SET len = len - 1;

END WHILE;

ELSEIF flag=2

THEN

WHILE len > 0 DO

IF ( (MID(Varstring,len,1)REGEXP'[0-9]')

OR (MID(Varstring,len,1)REGEXP '[a-zA-Z]') )

THEN

SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));

END IF;

SET len = len - 1;

END WHILE;

ELSEIF flag=3

THEN

WHILE len > 0 DO

IF NOT (MID(Varstring,len,1)REGEXP '^[u0391-uFFE5]')

THEN

SET Tmp=CONCAT(Tmp,MID(Varstring,len,1));

END IF;

SET len = len - 1;

END WHILE;

ELSE

SET Tmp = 'Error: The second paramter should be in (0,1,2,3)';

RETURN Tmp;

END IF;

RETURN REVERSE(Tmp);

END$$

DELIMITER ;

利用上述代码,在MySQL中创建一个名为Num_char_extract的函数,即可通过调用该函数进行字符提取。

使用方法如下:

(1) 第二个参数为0:代表提取数字

(2) 第二个参数为1:代表提取字母

(3) 第二个参数为2:代表提取数字+字母

(4) 第二个参数为3:代表提取汉字

(5) 第二个参数为其他数字:打印错误提示

示例2:DELIMITER $$

DROP FUNCTION IF EXISTS `Num_char_extract3`$$

CREATE FUNCTION `Num_char_extract3`(Varstring VARCHAR(100)CHARSET utf8, myFlag VARCHAR(100) CHARSET utf8) RETURNS VARCHAR(50) CHARSET utf8

BEGIN

DECLARE len INT DEFAULT 0; -- Varstring的总长度

DECLARE bLen INT DEFAULT 0;-- 当前循环开始的字符位置

DECLARE flag INT DEFAULT 0; -- 定义获取文字的类别,0 表示(0),(-1)这种格式;1,表示D1,D2这种格式

DECLARE myText VARCHAR(100) DEFAULT '';-- myFlag中的文字,例如(-1),则myText为-1;(1),则myText为1

DECLARE myTextNum INT DEFAULT 0; -- 和myText对应,是myText对应的数字

DECLARE myIndex INT DEFAULT -1;-- D1,D2里面1,2的数字

DECLARE Tmp VARCHAR(100) DEFAULT '';-- 返回的字符串

DECLARE v_isFind BOOL DEFAULT FALSE;-- 标记是否找到

DECLARE prevChar VARCHAR(1) DEFAULT NULL;-- 上一个字符

DECLARE myReturn VARCHAR(100) DEFAULT '';

SET len = CHAR_LENGTH(Varstring);

SET bLen = 0;

IF LOCATE ('(',myFlag) > 0 AND LOCATE (')',myFlag) > 0 THEN SET flag = 0;

ELSEIF LOCATE ('D',myFlag) > 0 THEN SET flag = 1;

ELSE SET flag = -1;

END IF;

IF flag = 0

THEN

-- (1)取()中的按照字符串分割,取索引位置为0值,例如马栏山连接线(K0+000~K3+840)”,(0)特征值取“马栏山连接线”,(1)取特征值取“K0+000~K3+840”

SET myText = SUBSTRING_INDEX(SUBSTRING_INDEX(myFlag,')',1),'(',-1);-- 取出括号内的数字

IF myText NOT REGEXP '[0-9]' THEN

SET Tmp = 'Error: The (1111) paramter should be in num';

RETURN Tmp;

ELSE

SET myTextNum = myText+0;-- 转为数字

END IF;

IF myText = '0' THEN -- 取括号外的内容

WHILE bLen <= len DO

IF MID(Varstring,bLen,1) NOT REGEXP'[(]' AND MID(Varstring,bLen,1) NOT REGEXP'[(]' THEN

SET Tmp=CONCAT(Tmp,MID(Varstring,bLen,1));

ELSE

SET bLen = len;-- 即跳出循环

END IF;

SET bLen = bLen + 1;

END WHILE;

ELSE

IF LOCATE ('(',Varstring) > 0 THEN -- 兼容中文括号和外文括号

SET myText = SUBSTRING_INDEX(SUBSTRING_INDEX(Varstring,')',1),'(',-1);

ELSE

SET myText = SUBSTRING_INDEX(SUBSTRING_INDEX(Varstring,')',1),'(',-1);

END IF;

SET Tmp = SPLIT_STR(myText, ',', myTextNum);

END IF;

ELSEIF flag=1

THEN

SET myText = SUBSTRING(myFlag,2);-- 截取D之后的所有字符

IF myText NOT REGEXP '[0-9]' THEN

SET Tmp = 'Error: The (222) paramter should be in num';

RETURN Tmp;

ELSE

SET myIndex = myText+0;-- 转为数字

END IF;

SET myTextNum = 0;-- 当前循环的已经获取的符合条件的个数

-- D1,D2,D3:表示分别于分项名称中第一个开始的数字+字母的值,如冲击钻机冲孔桩径150cm以内孔深30m以内黏土,D1表示特征值的为150cm,D2特征值的为30m

WHILE bLen <= len DO

IF bLen > 0 THEN

SET prevChar = MID(Varstring,bLen-1,1);-- 存放上一个的字符

END IF;

IF MID(Varstring,bLen,1) REGEXP '[0-9]' AND (prevChar IS NULL OR prevChar REGEXP '[0-9]' OR Tmp = '') THEN -- 获取连续的数字

SET Tmp=CONCAT(Tmp,MID(Varstring,bLen,1));

ELSE

IF prevChar REGEXP'[0-9]' AND (MID(Varstring,bLen,1) REGEXP '[a-zA-Z]') THEN-- 如果上一个是数字,当前是字母,则符合条件

SET myTextNum = myTextNum+1;-- 已经符合条件的个数,myTextNum则累加1

IF myIndex = myTextNum THEN -- 如果已经找到满足条件的个数了

SET v_isFind = TRUE;

SET Tmp=CONCAT(Tmp,MID(Varstring,bLen,1));

END IF;

ELSE

IF v_isFind THEN -- 已经找到,如果没有找到,则需要继续找

IF (MID(Varstring,bLen,1) NOT REGEXP '[a-zA-Z]') THEN -- 只要不匹配字母,则推出

SET bLen = len;-- 即跳出循环

ELSE

SET Tmp=CONCAT(Tmp,MID(Varstring,bLen,1)); -- 匹配,则一直累加

END IF;

ELSE

SET Tmp = '';-- 开始新一轮循环

END IF;

END IF;

END IF;

SET bLen = bLen + 1;

END WHILE;

ELSE

SET Tmp = 'Error: The second paramter should be in (0,1,2,3)';

RETURN Tmp;

END IF;

RETURN Tmp;

END$$

DELIMITER ;

1.查询结果SELECT Num_char_extract3('马栏山连接线(K0+000~K3+840,连接线)','(0)');//马栏山连接线

SELECT Num_char_extract3('马栏山连接线(K0+000~K3+840,连接线)','(1)');//K0+000~K3+840

SELECT Num_char_extract3('马栏山连接线(K0+000~K3+840,连接线)','(2)');//连接线

SELECT Num_char_extract3('冲击70钻65机冲孔桩径150cm以内孔深30m以内黏土80km我的世界90我的','D0');//""

SELECT Num_char_extract3('冲击70钻65机冲孔桩径150cm以内孔深30m以内黏土80km我的世界90我的','D1');//150cm

SELECT Num_char_extract3('冲击70钻65机冲孔桩径150cm以内孔深30m以内黏土80km我的世界90我的','D2');//30m

SELECT Num_char_extract3('冲击70钻65机冲孔桩径150cm以内孔深30m以内黏土80km我的世界90我的','D3');//80km

SELECT Num_char_extract3('冲击70钻65机冲孔桩径150cm以内孔深30m以内黏土80km我的世界90我的','D4');//""

mysql筛选英文字符_MySQL:字符串中的数字、英文字符、汉字提取相关推荐

  1. mysql小写转大写_MySQL字符串中的大小写转换详解

    以下的文章主要是对MySQL字符串的实际应用的介绍,其中包括对MySQL数据库字符串的大小写转换,以及如何清除字符串首尾空格的实际操作步骤,以下就是详细内容的描述,望你会有所收获. MySQL字符串大 ...

  2. 输出英文字母,字符串中所有英文字符

    Description 给定一个字符串,将字符串中的所有英文字母找出并输出. Input 若干组数据,每组数据只有一个字符串. Output 字符串中所有英文字符. Sample Input abc1 ...

  3. mysql提取数字_Mysql中实现提取字符串中的数字的自定义函数分享

    因需要在mysql的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的mysql函数,可以有效的从字符串中提取出数字. 该mysql提取出字符串中的数字函数如下: 复制代码 代 ...

  4. mysql sql 字符串字段保留数字_sql中取字符串中的数字语句_MySQL

    bitsCN.com one: declare @s varchar(20) declare @i varchar(20) set @i='' set @s='新会员必须购买350元产品' while ...

  5. mysql getnum函数_Mysql中实现提取字符串中的数字的自定义函数分享

    因需要在MysqL的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的MysqL函数,可以有效的从字符串中提取出数字. 该MysqL提取出字符串中的数字函数如下: CREATE ...

  6. mysql 过滤纯数字_mysql中怎么样过滤字符串中的数字

    今天,有网友邮件问我,怎么样过滤掉字符串中的数字,比如: mysql> select * from TEST; +---------+------------------------+ | Co ...

  7. c 语言 字符 查找,C 语言实例 - 查找字符在字符串中出现的次数

    C 语言实例 - 查找字符在字符串中出现的次数 C 语言实例 C 语言实例 查找字符在字符串中的起始位置(索引值从 开始). 实例 #include int main() { char str[], ...

  8. java 字符串 数字个数_JAVA 统计字符串中中文,英文,数字,空格的个数

    packagecom.example.test;public classCountCharacter {/**中文字符*/ private int chCharacter = 0;/**英文字符*/ ...

  9. JAVA输出字符串中字母_Java输出字符串中的大写英文字母数,小写英文字母数以及非英文字母的三种方法...

    import java.util.*; /** * 3.编写一个程序,输出一个字符串中的大写英文字母数,小写英文字母数以及非英文字母. 提示: 方法一:使用循环提取字符,判断字符是否在A-Z .a-z ...

  10. 7-65 字符串替换 (15 分) 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换: 原字母 对应字母 A Z B Y C X D W … … X C Y B Z A

    7-65 字符串替换 (15 分) 本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换: 输入格式: 输入在一行中给出一个不超过80个字符.并以回车结束的字符串. 输出格式: 输出在一行 ...

最新文章

  1. 奔图打印机显示未连接_手机连接奔图打印机,无法打印的解决方法
  2. 团队作业1——团队展示选题
  3. vorwerk 机器人_福维克(Vorwerk)--吸尘器行业的quot;安利quot;
  4. linux下改变文件的字符编码
  5. mysql大量重复值建立索引_对于有大量重复数据的表添加唯一索引
  6. java mic波形识别_会议季Mic Drop:您不应该错过的13场Java演讲
  7. linux gradle仓库位置,如何在Android Studio中使用Gradle发布项目至Jcenter仓库
  8. 大规模搜索+预训练,百度是如何落地的?
  9. TensorFlow windows之Tensorboard使用
  10. Javascript FormData实例
  11. 【读书笔记】企业IT架构转型之道 阿里巴巴中台战略思想和架构实战
  12. python小工具—图片拼接PDF
  13. vue中 jsbarcode的使用技巧
  14. 2023年深圳市绿色低碳产业扶持计划申报指南
  15. ORA-00600: internal error code, arguments: [2037]
  16. win10家庭版解决“管理员已阻止你运行此应用”
  17. WebRTC音频系统 音频发送和接收
  18. Oracle物化视图与物化视图日志
  19. NVIDIA Control Panel 出现问题。请与你的系统管理员联系,以了解有关修复或重新安装该应用的信息。 关于win10安装新版N卡驱动没有显卡控制面板的解决办法
  20. 周鸿祎:“作恶”的创新?

热门文章

  1. 新手入门,网络营销需要做什么?
  2. 使用Java生成excel文件:apache-poi
  3. iOS 将字符串转成txt文档
  4. 蓝桥杯练习题 <42点问题> 枚举法
  5. 静态页面下,页面编码为gb2312,但是源代码中出现大量/uxxxx的解决方法
  6. 会计与计算机发展现状及发展趋势,会计电算化的现状及其发展趋势毕业论文.doc...
  7. 计算机用户年龄段,用户性别、年龄分布_调研中心专项研究-中关村在线
  8. [图像拼接]APAP算法及相关问题研究
  9. #include lt;NOIP2008 Juniorgt; 双栈排序 ——using namespace wxl;
  10. python DEA: 考虑非期望产出的非径向距离函数NDDF