正则表达式使用技巧二

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ZC.Common
{
    public class RegexDao
    {
        private RegexDao() { }

private static RegexDao instance = null;
        /// <summary>
        /// 静态实例化单体模式
        /// 保证应用程序操作某一全局对象,让其保持一致而产生的对象
        /// </summary>
        /// <returns></returns>
        public static RegexDao GetInstance()
        {
            if (RegexDao.instance == null)
            {
                RegexDao.instance = new RegexDao();
            }
            return RegexDao.instance;
        }

/// <summary>
        /// 判断输入的字符串只包含汉字
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsChineseCh(string input)
        {
            return IsMatch(@"^[\u4e00-\u9fa5]+$", input);
        }

/// <summary>
        /// 匹配3位或4位区号的电话号码,其中区号可以用小括号括起来,
        /// 也可以不用,区号与本地号间可以用连字号或空格间隔,
        /// 也可以没有间隔
        /// \(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}|\(0\d{3}\)[- ]?\d{7}|0\d{3}[- ]?\d{7}
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsPhone(string input)
        {
            string pattern = "^\\(0\\d{2}\\)[- ]?\\d{8}$|^0\\d{2}[- ]?\\d{8}$|^\\(0\\d{3}\\)[- ]?\\d{7}$|^0\\d{3}[- ]?\\d{7}$";
            return IsMatch(pattern, input);
        }

/// <summary>
        /// 判断输入的字符串是否是一个合法的手机号
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsMobile(string input)
        {
            return IsMatch(@"^1\\d{10}$", input);
        }

/// <summary>
        /// 判断输入的字符串只包含数字
        /// 可以匹配整数和浮点数
        /// ^-?\d+$|^(-?\d+)(\.\d+)?$
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsNumber(string input)
        {
            string pattern = "^-?\\d+$|^(-?\\d+)(\\.\\d+)?$";
            return IsMatch(pattern, input);
        }

/// <summary>
        /// 匹配非负整数
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsNotNagtive(string input)
        {
            return IsMatch(@"^\d+$", input);
        }
        /// <summary>
        /// 匹配正整数
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsUint(string input)
        {
            return IsMatch(@"^[0-9]*[1-9][0-9]*$", input);
        }

/// <summary>
        /// 判断输入的字符串字包含英文字母
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsEnglisCh(string input)
        {
            return IsMatch(@"^[A-Za-z]+$", input);
        }

/// <summary>
        /// 判断输入的字符串是否是一个合法的Email地址
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsEmail(string input)
        {
            string pattern = @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$";
            return IsMatch(pattern, input);
        }

/// <summary>
        /// 判断输入的字符串是否只包含数字和英文字母
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsNumAndEnCh(string input)
        {
            return IsMatch(@"^[A-Za-z0-9]+$", input);
        }

/// <summary>
        /// 判断输入的字符串是否是一个超链接
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsURL(string input)
        {
            string pattern = @"^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$";
            return IsMatch(pattern, input);
        }

/// <summary>
        /// 判断输入的字符串是否是表示一个IP地址
        /// </summary>
        /// <param name="input">被比较的字符串</param>
        /// <returns>是IP地址则为True</returns>
        public static bool IsIPv4(string input)
        {
            string[] IPs = input.Split(‘.‘);

for (int i = 0; i < IPs.Length; i++)
            {
                if (!IsMatch(@"^\d+$", IPs[i]))
                {
                    return false;
                }
                if (Convert.ToUInt16(IPs[i]) > 255)
                {
                    return false;
                }
            }
            return true;
        }

/// <summary>
        /// 判断输入的字符串是否是合法的IPV6 地址
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public static bool IsIPV6(string input)
        {
            string pattern = "";
            string temp = input;
            string[] strs = temp.Split(‘:‘);
            if (strs.Length > 8)
            {
                return false;
            }
            int count = RegexDao.GetStringCount(input, "::");
            if (count > 1)
            {
                return false;
            }
            else if (count == 0)
            {
                pattern = @"^([\da-f]{1,4}:){7}[\da-f]{1,4}$";
                return IsMatch(pattern, input);
            }
            else
            {
                pattern = @"^([\da-f]{1,4}:){0,5}::([\da-f]{1,4}:){0,5}[\da-f]{1,4}$";
                return IsMatch(pattern, input);
            }
        }

#region 正则的通用方法
        /// <summary>
        /// 计算字符串的字符长度,一个汉字字符将被计算为两个字符
        /// </summary>
        /// <param name="input">需要计算的字符串</param>
        /// <returns>返回字符串的长度</returns>
        public static int GetCount(string input)
        {
            return Regex.Replace(input, @"[\u4e00-\u9fa5/g]", "aa").Length;
        }

/// <summary>
        /// 调用Regex中IsMatch函数实现一般的正则表达式匹配
        /// </summary>
        /// <param name="pattern">要匹配的正则表达式模式。</param>
        /// <param name="input">要搜索匹配项的字符串</param>
        /// <returns>如果正则表达式找到匹配项,则为 true;否则,为 false。</returns>
        public static bool IsMatch(string pattern, string input)
        {
            if (input == null || input == "") return false;
            Regex regex = new Regex(pattern);
            return regex.IsMatch(input);
        }

/// <summary>
        /// 从输入字符串中的第一个字符开始,用替换字符串替换指定的正则表达式模式的所有匹配项。
        /// </summary>
        /// <param name="pattern">模式字符串</param>
        /// <param name="input">输入字符串</param>
        /// <param name="replacement">用于替换的字符串</param>
        /// <returns>返回被替换后的结果</returns>
        public static string Replace(string pattern, string input, string replacement)
        {
            Regex regex = new Regex(pattern);
            return regex.Replace(input, replacement);
        }

/// <summary>
        /// 在由正则表达式模式定义的位置拆分输入字符串。
        /// </summary>
        /// <param name="pattern">模式字符串</param>
        /// <param name="input">输入字符串</param>
        /// <returns></returns>
        public static string[] Split(string pattern, string input)
        {
            Regex regex = new Regex(pattern);
            return regex.Split(input);
        }

/* *******************************************************************
         * 1、通过“:”来分割字符串看得到的字符串数组长度是否小于等于8
         * 2、判断输入的IPV6字符串中是否有“::”。
         * 3、如果没有“::”采用 ^([\da-f]{1,4}:){7}[\da-f]{1,4}$ 来判断
         * 4、如果有“::” ,判断"::"是否止出现一次
         * 5、如果出现一次以上 返回false
         * 6、^([\da-f]{1,4}:){0,5}::([\da-f]{1,4}:){0,5}[\da-f]{1,4}$
         * ******************************************************************/
        /// <summary>
        /// 判断字符串compare 在 input字符串中出现的次数
        /// </summary>
        /// <param name="input">源字符串</param>
        /// <param name="compare">用于比较的字符串</param>
        /// <returns>字符串compare 在 input字符串中出现的次数</returns>
        private static int GetStringCount(string input, string compare)
        {
            int index = input.IndexOf(compare);
            if (index != -1)
            {
                return 1 + GetStringCount(input.Substring(index + compare.Length), compare);
            }
            else
            {
                return 0;
            }

}
        /// <summary>
        /// 根据结构体RegularFormula,返回具体正则表达式
        /// </summary>
        /// <param name="RegulatFormula"></param>
        /// <returns></returns>
        private static string GetRegularFormula(string RegulatFormula)
        {
            //string str = "";
            //if (RegulatFormula.ToUpper().IndexOf("RegularFormula".ToUpper()) > -1)
            //{
            //    RegularFormula formula = new RegularFormula();
            //    Type type = typeof(RegularFormula);
            //    foreach (System.Reflection.FieldInfo info in type.GetFields())
            //    {
            //        if (("RegularFormula." + info.Name).ToUpper() == RegulatFormula.ToUpper())
            //        {
            //            str = info.GetValue(formula).ToString();
            //        }
            //    }
            //    return str;
            //}
            //return RegulatFormula;
            return "";
        }

#endregion
    }
}

时间: 2024-10-11 04:46:52

正则表达式使用技巧二的相关文章

Eclipse用法和技巧二十四:当git遇上eclipse

git是非常优秀的代码管理工具,eclipse是非常不错的,免费的IDE.工作中两者碰到一起,有点麻烦了:eclipse对于每个项目会生成一些特定的文件,而这些文件又不是项目必须的,并且每个人的配置是不一样的,所以这些文件不好放入版本库随代码统一管理.刚开始的时候,本人是在执行 git add 或者git reset这些命令的时候指定文件,这个就没有直接来 git add .这样的命令方便了.接下来就介绍一个一劳永逸的方法:        步骤一:进入当前项目仓库的.git目录,进入info目录

Eclipse用法和技巧二十七:定义自己的快速联想词

某天在调试代码的时候,虽然是android的project还是习惯的输入syso,然后在ALT+/一下.旁边的同事就问了一下,这个log打印输出的tag是什么.接着又问了为什么syso能够智能联想出这个.第一个问题很好回答,不过对于第二个问题还真答不上来.大学里面第一次见某个学长使用这个技能之后,就默默的记住了,也没有多想是什么回事.这两天留意了一下,原来是类似java代码模版的一个东东.在一想为什么不自己定义android的联想词呢...        步骤一:打开preference,搜索e

Linux Shell常用技巧(二)

七. grep家族:       1.  grep退出状态:    0: 表示成功:    1: 表示在所提供的文件无法找到匹配的pattern:    2: 表示参数中提供的文件不存在.    见如下示例:    /> grep 'root' /etc/passwd    root:x:0:0:root:/root:/bin/bash    operator:x:11:0:operator:/root:/sbin/nologin    /> echo $?    0        />

思科命令配置小技巧二:macro命令

在 思科命令配置小技巧一中,我们谈到,使用range命令可以简化我们的配置 但是如果我们经常对一组不连续的端口进行操作 比如 interface-range  fa1/1 ,fa1/3 ,fa1/5 ,fa1/7 ,fa1/11 即使使用range命令也会显得很繁琐 我们总想越简单越好(命令敲再多,工资还是那个数,要是按命令字数算工资多好) 此时交换机的宏命令就派上用场了 suzhouxiaoniu(config)#define interface-range abc fa1/1 ,fa1/3

CSS技巧二

元素缩写 font中属性的放置顺序是严格遵守的,否则不会生效. Font:font-style font-weight font-size font-familiy;(注:font-size和font-family是font的必须属性,并且font-size一定要放在font-family的前面) Margin:margin-top margin-right margin-bottom margin-bottom ; Padding:padding-top padding-right paddi

SQL开发技巧(二)

本系列文章旨在收集在开发过程中遇到的一些常用的SQL语句,然后整理归档,本系列文章基于SQLServer系列,且版本为SQLServer2005及以上…… 文章系列目录 SQL开发技巧(一) SQL开发技巧(二) 本文内容简介 这篇文章主要介绍以下内容: 快速查询表的总记录数 非递归查询树形结构表的所有子节点 清除查询缓存 编程中构建Where语句的小技巧 如何进行跨服务器的数据库查询 快速查询表的总记录数 什么,你还在用select count(*) from xxx?难道没有园友告诉你用se

Eclipse用法和技巧二十八:Eclipse插件Easy Explore的今世

先说明一下easyexplore插件的功能,easyexplore是一个类似于 Windows Explorer的Eclipse插件,它可以帮助你在不退出Eclipse的环境下迅速浏览本地文件系统. 具体可以看图: 前一阵子项目组来了一批新员工,在配置开发环境的时候,发现有的员工可以安装easyexplore插件,有的安装无效.经过分析发现,有的员工用的Eclipse是从Android开发网站上下载的,adt-bundle-windows包里面的,Eclipse的版本是JUNO版本,有的员工的E

Eclipse用法和技巧二十五:eclipse图标的含义

用了eclipse很久,在使用断点调试的时候才开始关注图标的含义.这才发现eclipse的图标还是很丰富的,熟悉的知道每个图标的含义还是蛮不错的,尤其是在断点调试中.eclipse自带了详细的图标说明,下面来看看怎么打开这个说明:       步骤一:打开Help -> Tips and Tricks        步骤二:打开Java development user guide -> Reference -> icons 这样就可以看到了eclipse的所有图标说明了,当然在步骤二中

Eclipse用法和技巧二十:一个快速打印技巧

调试的时候经常用到打印语句,当需要添加的说明字符串和需要打印的数值混淆到一起的时候,需要先写字符串如,"the string here is",接着再输入变量的值.这样一来一去还是比较麻烦的.下面介绍一种方法,可以大大的提高效率.        步骤一:假定需要打印temp的值,先输入完整的打印字符串: 步骤二:选中temp,按住神键Ctrl+1: 步骤三:选择提示选项,在删除双引号即大功告成.在需要打印的变量混淆在提示字符串中,这个方法能大大加快输入速度. 上一篇文章,Eclipse