zoukankan      html  css  js  c++  java
  • C# 正则表达式

    1.为什么要用正则表达式

      1.1 正则表达式主要操作字符串,可验证是否符合某种规则,可从中截取满足设定要求的子字符串,可对子字符串进行替换

      1.2 如果不用正则表达式,为了程序的严谨你的程序必定要有大量的if判断,和IndexOf、SubString之类的代码,并且即使你自认为考虑的很全面,也往往有可能会忽视其中的某一种情况

    2.C#正则表达式工具代码类

      需要using System.Text.RegularExpressions;

    /// <summary>
    /// 验证字符串是否满足正则表达式
    /// </summary>
    /// <param name="regularExpression">正则表达式</param>
    /// <param name="inputStr">输入字符串</param>
    /// <returns>true为满足;false为不满足</returns>
    public static bool RegexIsOK(string regularExpression, string inputStr)
    {
        Regex objRegex = new Regex(regularExpression, RegexOptions.IgnoreCase);
        if (objRegex.IsMatch(inputStr))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    验证字符串是否满足正则表达式
    /// <summary>
    /// 提取符合正则表达式要求的所有字符串
    /// </summary>
    /// <param name="regularExpression">正则表达式</param>
    /// <param name="inputStr">输入字符串</param>
    /// <returns>返回的数据集</returns>
    public static List<string> RegexExtracts(string regularExpression, string inputStr)
    {
        List<string> list = new List<string>();
        var cols = Regex.Matches(inputStr, regularExpression);
        for (int i = 0; i < cols.Count; i++)
        {
            list.Add(cols[i].Value);
        }
        return list;
    }
    提取符合正则表达式要求的所有字符串
    /// <summary>
    /// 提取符合正则表达式要求的第一个匹配项
    /// </summary>
    /// <param name="regularExpression">正则表达式</param>
    /// <param name="inputStr">输入字符串</param>
    /// <returns>返回的数据</returns>
    public static string RegexExtractOnlyOne(string regularExpression, string inputStr)
    {
        return Regex.Match(inputStr, regularExpression).Value;
    }
    提取符合正则表达式要求的第一个匹配项

    3.举例

      例如说我的程序有一个用户书写脚本指令的功能,大致的格式是   xMove(200,33,Abs);   或   xMove(2000,330000,Rel); 

      这个脚本指令意思是X轴伺服马达以绝对位置(Abs)或相对位置(Rel),目标位置是200或2000,运行速度是33或330000

      因为你不知道你的客户会不会是个傻傻的人,所以你一定要考虑的很全面,上述这个例子如果用常规的if加字符串截取的方式做很麻烦

    if (Content.StartsWith("xMove") && Content.Contains("(") && Content.Contains("(") && Content.Contains(","))
    {
        int index1 = Content.IndexOf('(');
        int index2 = Content.IndexOf(',');
        int index3 = Content.IndexOf(')');
        if (index1 < index2 && index2 < index3)
        {
            if (double.TryParse(Content.Substring(index1, index2 - index1), out pos) && double.TryParse(Content.Substring(index2, index3 - index2), out speed))
            {
                flag = true;
            }
        }
    }
    else
    {
        Log.Warn($"第{Id}行编译失败:"{Content}"指令不符合"xMove(1000,20000);"格式");
    }
    糟糕的代码

      诸如上述代码,要判断括号、分号、逗号的位置,以及三个参数都是可以合理的转换为数字和对应的枚举

    /*  Content待验证字符串  xMove(200,33,Abs);
     *  ^xMove(d+,d+,(Abs|rel));$   说明:^xMove表示以xMove开头  ;$表示以;结尾  ()不加表示一个整体,加了验证()本身   Abs|Rel是要么是Abs要么是Rel
     *  d+|(Abs|Rel)   d表示[0-9]  +表示至少重复1次   |表示或的意思
     */
    if (RegexTool.RegexIsOK(@"^xMove(d+,d+,(Abs|rel));$", Content))
    {
        List<string> list = RegexTool.RegexExtracts(@"d+|(Abs|Rel)", Content);
        if (list.Count==3)
        {
            pos = Convert.ToDouble(list[0]);
            speed = Convert.ToDouble(list[1]);
            moveType = (Enum_RelOrAbs)Enum.Parse(typeof(Enum_RelOrAbs), list[2]);
            return true;
        }
    }
    正则表达式代码

    4.比较好的网址推荐和工具

      http://www.regexbuddy.com/

      https://c.runoob.com/front-end/854

      https://www.runoob.com/w3cnote/regular-expression-30-minutes-tutorial.html

    5.小结

      磨刀不误砍柴工,掌握更好的技术,可以提高自己编写代码的生产力

  • 相关阅读:
    docker exit status 255解决
    postgresql安装,java简单使用postgresql
    jQuery学习笔记
    2017.11.06
    UML类图讲解
    设计模式:可复用面向对象软件的基础
    conflicting types for xx错误
    QString的拼接
    source In sight 中修改自动补全快捷键方式
    设置Qt应用程序图标及应用程序名 【转载】
  • 原文地址:https://www.cnblogs.com/yangmengke2018/p/11091410.html
Copyright © 2011-2022 走看看