[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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 4,009评论 0 20
  • 推荐几个正则表达式编辑器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1阅读 11,491评论 9 151
  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,147评论 0 9
  • 几个正则表达式编辑器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
    没技术的BUG开发攻城狮阅读 4,587评论 0 23
  • 入秋的天气越来越凉。 刚从医院回来,拿了一些药。按说生活中十分注意的我,不应该这么体质弱。可是你知道,生活,从来就...
    来杯果汁不加糖阅读 202评论 0 0