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

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

  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

    原文作者:沉思的Panda
    原文地址: https://www.jianshu.com/p/6b1961fd5c00
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞