zoukankan      html  css  js  c++  java
  • 正则表达式替换指定格式内容,实现类似String的Format方法(用扩展方法)

    正则表达式真是个好东西

    项目中遇到一个解析字符串的问题,随便取其中一条:"Stage No[%d0-2], Head No[%d2-2], Nozzle Postion[%d4-2], Nozzle No[%d6-5], [%s20-2], PCB ID:[%x22-16], Ratio of bad nozzle error[%h38-2]"

    看结构很是熟悉,这不就是和平时用的String.Format格式一个样吗(String.Format("帅哥{0}你好,欢迎来到{1}世界!","风过之后的晴",".NET");),但是又有点区别,用[%d0-2]占位,d表示类型是数字,s表示类型是字符串,x表示16进制数(项目实际没有用到都是空),h和S比较几乎一样的(我把它当S处理)。接下来是0-2,2-2,4-2之类的,‘-’前面的数表示索引,后面的数表示长度。

    随便写一个源字符串:12345678900000000000aa00000000000000000000000000000000000000000000000000000000000000000000000000

    所以解析出来的内容应该是:Stage No12, Head No34, Nozzle Postion56, Nozzle No78900, aa, PCB ID:0, Ratio of bad nozzle error00

    最开始没有思路,网上随便查了下用正则表达式可以完成,引用命名空间:using System.Text.RegularExpressions; Regex的静态方法, 函数原型 public static string Replace(string input, string pattern, MatchEvaluator evaluator); 

    第一个参数是源字符串,第二个是正则表达式匹配格式,第三个是函数代理,参数为Match类型,匹配的数据。

    用法举例

     1 private string FormatString(string strSource, string strContent)
     2         {
     3             int index = 0;
     4             int length = 0;
     5             string strResult = Regex.Replace(strSource, @"[%(w)(d+)-(d+)]", m =>
     6             {
     7                 index = int.Parse(m.Groups[2].Value);
     8                 length = int.Parse(m.Groups[3].Value);
     9                 try
    10                 {
    11                     switch (m.Groups[1].Value)
    12                     {
    13                         case "d":
    14                             return int.Parse(strContent.Substring(index, length)).ToString();
    15                         case "s":
    16                         case "h":
    17                             return strContent.Substring(index, length);
    18                         case "x":
    19                             return Convert.ToInt32(strContent.Substring(index, length),16).ToString();
    20                         default:
    21                             return "";
    22                             23                     }
    24                 }
    25                 catch
    26                 {
    27                     return "";
    28                 }
    29                 30             });
    31             return strResult;
    32         }
    33     

    m.Groups是匹配结果的参数数组m.Groups[1]代表第一个参数(w)表示类型,m.Groups[2]代表第二个参数(d+)表示索引,代表第三个参数(d+)表示长度。每一次匹配到patten的时候会调用后面的委托进行替换。

    我们完全可以自己实现String.Format了,用一个扩展方法MyFormat.扩展方法必须在静态类中并引用其命名空间,因为我这里类都在一个命名空间所以不用再引用了。

    类写好后我们来比较一些结果,当然出来都是一样的,但是扩展方法比原来使用更方便一点。

    运行测试:

  • 相关阅读:
    C++test 关于resource参数和include/exclude参数说明
    开发程序 ip 127.0.0.0 0.0.0.0原理与区别
    安装rails旧版本出错bin_path': can't find gem railties (["3.0.5"]) with executable rails (Gem::GemNotFoundException)
    rails excel的创建
    ruby nil? empty? blank? 的区别
    rails 调试工具pry 换掉debugger 和 rails c
    rails respond_to 的原理与使用
    rails transaction 的用法
    ssh的传送文件命令
    出现了pid的错误A server is already running. 和如何改变webrick的端口值
  • 原文地址:https://www.cnblogs.com/Iamsorry/p/5707409.html
Copyright © 2011-2022 走看看