这个是我做的使用正则表达式来切割字符串的一个案例部分代码:

功能简介:一条物流信息字符串中截取出多种数据详情

需要切割出的数据包括:

起始地,目的地,货物数量,货物单位,货物类型,车数量,车长度,车类型,价格,价格单位

需要切割字符串类型举例(多种,包括有车求货,有货求车等):

1、湖南衡阳->湖南湘潭、湖南长沙,有6米半封闭车,求1-8吨货

2、湖南长沙->河南南阳,有9.6米平板车,求货

3、湖南长沙->青海、陕西西安、陕西汉中、陕西安康,有2台6.8米高栏车,求12-25吨货

4、湖南湘潭->湖南岳阳临湘,有27-120吨重货,求1-3台9.6-17.5米车,今天定车 明天装货

5、湖南岳阳临湘->山东菏泽,有15-28吨棉花,求9.6-17米车,230元/吨,马上可以装货

6、湖南长沙->湖南益阳安化县,有1吨货物,求2-3米车,急运

7、湖南湘潭->江西赣州,有35-40吨货物,求半挂车,急运

...

当然,这些仅仅只是举例

下面是方法详细代码:

using System.Text;

using System.Text.Regularexpressions;

#region 使用正则表达式切割字符串
        /// <summary>
        /// 切割字符串分别赋值给KC_INFO实例的属性:
        /// KCI_START_ADDRESS,KCI_END_ADDRESS,KCP_GOODS_ID,KCI_GOODS_NUMBER,KCI_GOODS_UNIT,KCP_CAR_ID,KCI_CAR_NUMBER,KCI_CAR_LENGTH,KCI_PRICE,KCI_PRICE_UNIT
        /// </summary>
        /// <param name="ki"></param>
        public void splitMainInfoString(KC_INFO ki)
        {
            string reg_start_address = string.Format(@"^[^->]*(?=->)");
            string reg_end_address = string.Format(@"(?<=->)[^,]*(?=,)");
            string reg_goods_number = string.Empty;
            string reg_goods_unit = string.Empty;
            string reg_goods_id = string.Empty;
            string reg_car_id = string.Empty;
            string reg_car_number = string.Empty;
            string reg_car_length = string.Empty;
            string reg_price = string.Empty;
            string reg_price_unit = string.Empty;
            //用,号分割字符串
            MatchCollection ms = Regex.Matches(InfoText, @"[^,]*[^\s](?=,|$)");
            string goodsInfoString = string.Empty;
            string carInfoString = string.Empty;
            if((new int[]{2,22,5}.Contains(this.Type))) //有货求车
            {
                //货物信息字符串
                goodsInfoString = ms[1].ToString();
                //车辆信息字符串
                carInfoString = ms[2].ToString();
                //匹配货物数量的Regularexpression
                reg_goods_number = string.Format(@"(?<=有)((\d+\.\d+)|(\d+-\d+)|\d+)(?=(吨|方|件|车|公斤|个|台))");
                //匹配货物单位
                reg_goods_unit = string.Format(@"(?<=有((\d+\.?\d+)|(\d+-\d+)|\d+))(吨|方|件|车|公斤|个|台)");
                //匹配货物单位
                reg_goods_id = string.Format(@"(?<=有((\d+\.\d)|(\d+-\d+)(\d+))(吨|方|件|车|公斤|个|台))\w+");

//匹配需要车的数量
                reg_car_number = string.Format(@"(?<=求)((\d+-\d+)|(\d+))(?=台)|(?<=求)大量");
                //匹配车的长度
                reg_car_length = @"(?<=求*[^\d])((\d+\.\d+)|(\d+-\d+)|(\d+\.?\d{0,}-\d+\.?\d{0,})|(\d+))(?=米)";
                //匹配车的类型
                reg_car_id = string.Format(@"(冷藏|后八轮或前四后八|零担|\s无箱板车|本地车|驳船|60公分栏半挂)(?=车)");
            }
            else                                        //有车求货
            {
                goodsInfoString = ms[2].ToString();
                carInfoString = ms[1].ToString();
                //匹配需要货物数量
                reg_goods_number = @"(?<=求)(((\d+\.?\d{0,})-(\d+\.?\d{0,}))|(\d+\.\d+)|(\d+)|大量)";
                //货物单位统一为吨
                reg_goods_unit = string.Format("吨");
                //不限货物类型
                reg_goods_id = string.Empty;   
                //匹配车的数量
                reg_car_number = string.Format(@"(?<=有)(\d+-\d+|\d+|大量)(?=台)");
                //匹配车的长度
                reg_car_length = @"(((\d+\.?\d{0,})-(\d+\.?\d{0,}))|(\d+\.\d+)|\d+)(?=米)";
                //匹配车的类型
                reg_car_id= @"(?<=有\d+台*米)\w+(?=车)|(?<=有*米)\w{0,}车";
            }

//切割出起始地址
            ki.KCI_START_ADDRESS = r(reg_start_address);
            //切割出目的地址
            ki.KCI_END_ADDRESS = r(reg_end_address);
            //货物数量
            ki.KCI_GOODS_NUMBER = r(goodsInfoString, reg_goods_number).Length > 0 ? double.Parse(r(goodsInfoString, reg_goods_number)) : 0;
            //货物单位
            ki.KCI_GOODS_UNIT = r(goodsInfoString, reg_goods_unit);
            //暂定为1,通过得到的货物类型匹配相应的ID号码
            string goodsType = r(goodsInfoString, reg_goods_id);
            if (TypeDic.goodsTypeDic.Keys.Contains(goodsType))
                ki.KCP_GOODS_ID = TypeDic.goodsTypeDic[goodsType].ID;
            else
                ki.KCP_GOODS_ID = 1;//缺省编号
            //车类型,暂定为1,通过得到的车类型匹配相应的ID号码
            string carType = r(reg_car_id);
            if (TypeDic.carTypeDic.Keys.Contains(carType))
                ki.KCP_CAR_ID = TypeDic.carTypeDic[carType].ID;
            else
                ki.KCP_CAR_ID = 1;
            //车的数量
            ki.KCI_CAR_NUMBER = r(carInfoString, reg_car_number);
            //车的长度
            string len = r(carInfoString, reg_car_length);
            ki.KCI_CAR_LENGTH = len.Length > 0 ? double.Parse(len) : 0;
            if (ms.Count > 3)      //如果信息字符串中包含价格信息
            {
                string priceInfoString = ms[3].ToString();
                //匹配价格
                reg_price = @"((\d+\.?\d{0,}-\d+\.?\d{0,})|(\d+\.\d+)|(\d+))(?=元)";
                //匹配价格单位
                reg_price_unit = string.Format(@"(?<=元\/)(吨|方|个|台|件|车|箱)");
                //价钱
                string price = r(priceInfoString, reg_price);
                ki.KCI_PRICE = price.Length > 0 ? double.Parse(price) : 0;
                //价格单位
                ki.KCI_PRICE_UNIT = r(priceInfoString, reg_price_unit);
            }
        }
        /// <summary>
        /// 执行匹配捕获,返回符合条件的字符串
        /// </summary>
        /// <param name="regularexpression"></param>
        /// <returns></returns>
        private string r(string regularexpression)
        {
            return Regex.Match(InfoText, regularexpression).ToString();
        }
        private string r(string input,string regularexpression)
        {
            return Regex.Match(input, regularexpression).ToString();
        }
        #endregion

在最初我是想完全使用正则表达式来完成这个工作,但是如果这样Regex将会复杂无比,哪怕现在这段代码中你看起来比较简单的一些字段匹配.

下面是我最初写的使用平衡组来取得货物数量的正则表达式.

//带详细数据的货物类型捕获表达式:   (?<=,有\d{0,}\.?\d{0,}((吨|方|件|车|公斤|个|台)))\w+(?=,)
            //无详细数据的货物类型捕获表达式:   (?<=,有)货物(?=,)
            (?(,有\d))(?<=,有\d{0,}\.?\d{0,}((吨|方|件|车|公斤|个|台)))\w+(?=,)|(?<=,有)货物(?=,)"

这里只是代码,如果有需要注释解析的朋友,回帖中告诉我,我会附上注释.

三天的正则表达式学习发现,看起来复杂的东西,未必就正的用起来也很复杂,很明显,如果纯粹通过程序的判断和字符串方法来取得我想要的数据,这将是一个超级复杂的逻辑,不但易错,而且效率很低.

转载于:https://www.cnblogs.com/huanju/archive/2010/05/10/1732164.html

C#中切割字符串之正则表达式应用相关推荐

  1. python基础系列教程——python中的字符串和正则表达式全解

    全栈工程师开发手册 (作者:栾鹏) python教程全解 转义字符 正则表达式是建立在字符串的基础上,当需要在字符中使用特殊字符时,python用反斜杠\转义字符.如下表: 转义字符 描述\(在行尾时 ...

  2. 微信小程序-wxml中切割字符串

    问题 需要将item.letter_date("2020-10-02 09:02:01")切割成"2020-10" <view class="l ...

  3. SQL笔记4:mysql切割字符串的4种方式

    前言 本文参考了https://blog.csdn.net/qq_37260640/article/details/79731295 题目来源于牛客网sql52: 获取Employees中的first ...

  4. linux shell 从变量中按指定字符切割字符串

    #切割dmgeo-system-service__DM01-DEV__FWAA01Aline=dmgeo-system-service__DM01-DEV__FWAA01Aservice_name=$ ...

  5. js 动态拼接html 正则,在JavaScript中使用动态(可变)字符串作为正则表达式模式...

    小编典典 要从字符串创建正则表达式,必须使用JavaScript的RegExpobject. 如果你也想匹配/替换超过一次,那么你就 必须添加的g(全局匹配)标志.这是一个例子: var string ...

  6. php截取数组中的字符串,PHP 中使用explode()函数切割字符串为数组的示例

    explode()函数的作用:使用一个字符串分割另一个字符串,打散为数组. 例如: 字符串 PHP;"> $pizza = "第1 第2 第3 第4 第5 第6"; ...

  7. Js 正则表达式截取html内容,如何从JavaScript中的字符串中剥离HTML(仅提取文本内容)...

    本文概述 通常, 在服务器端, 你可以使用一系列PHP函数(例如strip_tags)并删除HTML和难看的格式.但是, 如果你无法使用服务器(或使用Node.js)来完成此任务, 则仍可以使用Jav ...

  8. php正则匹配字符_php中字符串和正则表达式详解

    一.字符串类型的特点 1.PHP是弱类型语言,其他数据类型一般都可以直接应用于字符串函数操作. echo substr("123456",2,4);  //输出345 echo s ...

  9. java正则表达式所有字符串_java正则表达式如何获取字符串中所有匹配内容

    java正则表达式如何获取字符串中所有匹配内容以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! java正则表达式如何获取 ...

最新文章

  1. 用Python不回头也能看美女,这招你会了吗?
  2. python tqdm_Python基础 | 一个被忽视的神器tqdm
  3. WebStorm配置SVN
  4. gradle第二天(Building a RESTful Web Service)
  5. 数据结构和算法:第八章 图论算法
  6. CSS Hack 汇总快查
  7. php中高光显示的高数,[技术博客]React Native——HTML页面代码高亮数学公式解析...
  8. gcc编译出现:error: dereferencing pointer to incomplete type
  9. Linux C编程之七(2) 系统IO函数
  10. luogu P2783 有机化学之神偶尔会做作弊
  11. 【Python分子动力学】
  12. 邮件管理数据库设计--MySQL
  13. [软件更新]CuteFTP 8.3.3.0054
  14. 小白学六轴传感器MPU6050模块(1)
  15. 苹果备忘录怎么使用计算机,原来苹果备忘录这么神奇!你还不会用?网友:万把块白花了...
  16. linux桌面lxde 安装_在Ubuntu上,如何安装轻量的LXDE桌面
  17. 计算机硬盘解密,如何解除电脑硬盘密码 解除电脑硬盘密码方法【详解】
  18. Asterisk内核 拾遗
  19. 廖老师的Python教程——Python简介
  20. Github报错——Failed to connect to github.com port 443: Timed out

热门文章

  1. 坐标和变换的数学基础(2)
  2. 【0521模拟赛】小Z爱划水
  3. 归纳工作中用到的Linux 命令
  4. 【号外号外:微软收购 .NET 的开源实现 Xamarin 项目的公司】
  5. HTTP 错误 404.0 - Not Found 您要找的资源已被删除、已更名或暂时不可用。
  6. Nginx使用http_accesskey_module防盗链,告别referer,告别伪装
  7. Apollo升级系统 --- 使用说明
  8. HAL Flat Display Driver Demystified
  9. 前端使用vue-i18n做中英文翻译
  10. 找出和为某个数的连续正整数序列