Et Voilà | 明天你是否会想起,昨天你写的正则表达式

正则表达式,一个基础到不能再基础的概念,甚至很多非CS的人都会识会写。但还真保不准哪天突然就忘了,突然就写不出了,所以捋一捋还是很有必要的。人家没事要走两步,我们呢,没事就写两行。

正规的定义就不重复了,大家都能找到。正则表达式说白了就是给出一个模版或者说规范,然后看字符串是否匹配这个规范,进而根据结果做下一步处理。

正则表达式之常用符号

下面是一些正则表达式一些最常用的符号的解析:

想要什么?

[ ], 中括号表示这个位置出现哪些字符是符合规范,可以接受的。它可以嵌套使用。

表达式 含义
[123] 这里我需要1,2 或3,其他的不行
[0-9] 这里我需要数字
[a-cA-C] 这里我需要a到c或A到C, 也就是两个范围的并集
[^abc] 除了a,b和c, 其他都可以
[a-c&&[^bc]] &&两个范围的交集,这里表示a到c交不含b,c,也就是a

想要几个?

当你需要更精确的正则时,你有时候会需要定义某一个字符需要出现几次,这也是正则可以实现的。

表达式 含义
... 点表示任意字符,三个点即三个字符,随便啥,但一定要给我三个
y? y出现一次或零次(x<=1)
y* y出现零次或多次(x>=0)
y+ y出现一次或多次(x>=1)
y{n}? y出现n次(x=n)
y{n,}? y出现至少n次(x>=n)
y{n,m}? y出现n到m次(n<=x<=m)

一头一尾

正则表达式还可以帮助我们规定一些边界问题,使得匹配更为精确

表达式 含义
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界

边界问题还有其他一些表达式,不过使用较少,这里就不全部列举出来了,关于单词边界,后面大黄会举个例子

黑话暗语

面对很多复杂但又常用的规范,正则表达式还提供了一些简要的,约定俗成的写法,记住这些可以帮助我们大大简化一些表达式

表达式 含义
\d 数字
\D 非数字
\s 空白字符
\S 非空白字符
\w 单词字符 (单词字符包含"_")
\W 非单词字符

正则表达式之举个栗子

好了,让我们写两行吧。大黄用java来举栗子。首先,java中和正则表达式联系最紧密的三个类非他们莫属:

  • java.lang.String
  • java.util.regex.Pattern
  • java.util.regex.Matcher

贴上大黄的测试:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class regExp {

    public static void main(String[] args) {
        //用Pattern建立一个模版,这里我们需要正则表达式来设定你想要的规范
        Pattern p = Pattern.compile("[a-z]{3}");
        //引入一个匹配对象,这个就是你想要与模版进行匹配的目标
        Matcher m = p.matcher("abc");
        //通过matches()方法的调用来确认结果
        printResult(m.matches());
        
        //上面的三行代码可以用下面一行代码代替,是不是很简单
        printResult("Test1");
        printResult("abc".matches("[a-z]{3}"));
        
        //来匹配一个Ip地址
        printResult("Test2");
        printResult("192.168.0.aaa".matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}"));
        
        //再来个单词边界
        printResult("Test3");
        printResult("Hello world".matches("^H[a-z]{1,3}o\\b.*"));  
        printResult("Helloworld".matches("^H[a-z]{1,3}o\\b.*"));  
    }
    
    public static void printResult(Object o){
        System.out.println(o);
    }
}

结果是:

true
Test1
true
Test2
false
Test3
true
false

在IP地址和单词边界的例子中,可以看到大黄用了"\d"这样的表示方法,而非"\d",这是由于java的转义字符的原因,简单来说就是第一个反斜杠表示第二个反斜杠是反斜杠而不是其他转义字符的一部分。边界例子中第一个返回true第二个是false的原因就是\b的出现,它跟在o后面表示到o为止是一个单词。

Et voilà!

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

推荐阅读更多精彩内容

  • 推荐几个正则表达式编辑器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1阅读 11,348评论 9 151
  • 几个正则表达式编辑器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
    没技术的BUG开发攻城狮阅读 4,557评论 0 23
  • 本文译自 制作正则引擎的作者 Jan Goyvaerts 为工具 RegexBuddy 写的教程版权归原作者所有注...
    极客圈阅读 3,183评论 0 25
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,111评论 18 139
  • NPM 使用介绍 NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用...
    yyshang阅读 407评论 0 1