美文网首页大智收藏正则表达式计算机技术
[74→100] 用正则表达式来验证字符串

[74→100] 用正则表达式来验证字符串

作者: 沉思的Panda | 来源:发表于2016-07-08 21:11 被阅读675次

    在做登录、注册、用户资料修改等功能,经常需要做字符串验证,常规需求如下:

    1. 姓名:2到10位字符,不包含数字和特殊字符(``~!@#$%^&*()-=_+[]{};':"",./<>?"` )
    2. 手机号码:以1开头的11位数字
    3. 身份证号码:18位的,且前17位为数字,最后一位为数字或者大写X
    4. 邮箱:
    • 必须包含一个并且只有一个符号“@”
    • 第一个字符不得是“@”或者“.”
    • 不允许出现“@.”或者.@
    • 结尾不得是字符“@”或者“.”
    • 允许“@”前的字符中出现“+”
    1. 验证码:4到6位数字或字母
    2. 年龄:[0,200]的整数或小数(小数点后1位)
    3. 身高:2到3位整数或小数(小数点后1位)
    4. 体重:1到3位整数或小数(小数点后1位)

    这些需求中,最后三个可以用整型或浮点型来处理,前面五个都是字符串匹配,怎么满足这些林林总总的需求,一个好用的工具是正则表达式

    一、概念

    百度百科上定义如下:

    正则表达式,又称正规表示法、常规表示法。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

    其实 正则表达式 就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用这个“规则字符串”用来表达对字符串的一种过滤逻辑。
    给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

    1. 匹配字符串:给定的字符串是否符合正则表达式的过滤逻辑;
    2. 提取字符串:可以通过正则表达式,从字符串中获取我们想要的特定部分。

    基本上所有主流的高级语言(如 C++、java)、编辑器(notepad++、atom、EditPlus、Word)都支持正则表达式的解析。

    二、核心语法

    正则表达式由一些 普通字符 和一些 元字符(metacharacters)组成。

    A. 元字符:又称特殊字符,主要用来标识字符串匹配的位置、内容

    1. 位置标识字符
    • ^:匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
    • $:匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。
    • \b:匹配一个字边界,即字与空格间的位置。
    • \B:非字边界匹配。
    • ( ):标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
    • []:标记一个 中括号表达式 的。里面内容为候选项。
    • {}:标记 限定符表达式
    1. 内容标识字符:
    • .:匹配除换行符\n之外的任何单字符。
    • \d:匹配0-9。
    1. 内容重复状态标识字符
    • *:匹配前面的子表达式零次或多次。
    • +:匹配前面的子表达式一次或多次。
    • ?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
    • |:指明两项之间的一个选择。
    • {n,m}:其中n <= m。最少匹配 n 次且最多匹配 m 次。通用变体为{n}、{n,}

    *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。

    1. 转义字符:
    • \:将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("。

    B. 普通字符

    除了元字符外的其他字符都是普通字符,包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号(如换行\n、换页\p、制表符\t等)。

    三、JAVA实现

    package lib;
    
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * Created by shitianci on 16/7/8.
     */
    public class TextUtil {
    
        /**
         * 姓名:2到10位字符,不包含数字和特殊字符(`~!@#$%^&*()-=_+[]{};':"",./<>?")
         * 正则表达式为 ^[^~!@#\$%\^&\*\(\)\-=_\+\[\]\{\};':"",./<>\?]{2,100}$
         */
        public static boolean isName(String string) {
            String regex = "^[^`~!@#\\$%\\^&\\*\\(\\)\\-=_\\+\\[\\]\\{\\};':\",./<>\\?]{2,10}$";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(string);
            return m.matches();
        }
    
        /**
         * 手机号码:以1开头的11位数字
         * 正则表达式为:^(1)\d{10}$
         */
        public static boolean isPhone(String string) {
            String regex = "^(1)\\d{10}$";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(string);
            return m.matches();
        }
    
        /**
         * 身份证号码:18位的,且前17位为数字,最后一位为数字或者大写X
         * 正则表达式为:^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$
         */
        public static boolean isIdentification(String string) {
            String regex = "^(\\d{6})(\\d{4})(\\d{2})(\\d{2})(\\d{3})([0-9]|X)$";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(string);
            return m.matches();
        }
    
        /**
         * 邮箱
         *    1. 必须包含一个并且只有一个符号“@”
         *    2. 第一个字符不得是“@”或者“.”
         *    3. 不允许出现“@.”或者.@
         *    4. 结尾不得是字符“@”或者“.”
         *    5. 允许“@”前的字符中出现“+”
         * 正则表达式为:^[\w!#$%&'*+/=?^_`{|}~-]+(?:\.[\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\w](?:[\w-]*[\w])?\.)+[\w](?:[\w-]*[\w])?$
         */
        public static boolean isEmail(String string) {
            String regex = "^[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?$";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(string);
            return m.matches();
        }
    
        /**
         * 验证码:4到6位数字或字母
         * 正则表达式为:^[\da-zA-Z]{4,6}$
         */
        public static boolean isVerificationCode(String string) {
            String regex = "^[\\da-zA-Z]{4,6}$";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(string);
            return m.matches();
        }
    
    
    }
    

    参考:

    1. 正则表达式 - 语法
    2. 在线正则表达式测试

    Panda
    2016-07-08

    相关文章

      网友评论

        本文标题:[74→100] 用正则表达式来验证字符串

        本文链接:https://www.haomeiwen.com/subject/srhrjttx.html