正则表达式入门课
涂伟忠
高级研发工程师
立即订阅
3070 人已学习
课程目录
已更新 14 讲 / 共 16 讲
0/2登录后,你可以任选2讲全文学习。
开篇词 (2讲)
开篇词丨学习正则,我们到底要学什么?
免费
导读 | 余晟:我是怎么学习和使用正则的?
基础篇 (4讲)
01 | 元字符:如何巧妙记忆正则表达式的基本元件?
02丨量词与贪婪:小小的正则,也可能把CPU拖垮!
03 | 分组与引用:如何用正则实现更复杂的查找和替换操作?
04 | 匹配模式:一次性掌握正则中常见的4种匹配模式
应用篇 (7讲)
05 | 断言:如何用断言更好地实现替换重复出现的单词?
06 | 转义:正则中转义需要注意哪些问题?
07 | 正则有哪些常见的流派及其特性?
08 | 应用1:正则如何处理 Unicode 编码的文本?
09 | 应用2:如何在编辑器中使用正则完成工作?
10 | 应用3:如何在语言中用正则让文本处理能力上一个台阶?
11 | 如何理解正则的匹配原理、优化原则
加餐 (1讲)
加餐 | 从编程语言的角度来理解正则表达式
正则表达式入门课
15
15
1.0x
00:00/00:00
登录|注册

10 | 应用3:如何在语言中用正则让文本处理能力上一个台阶?

涂伟忠 2020-07-06
你好,我是伟忠。今天要和你分享的内容是如何在编程语言中使用正则,让文本处理能力上一个台阶。
现代主流的编程语言几乎都内置了正则模块,很少能见到不支持正则的编程语言。学会在编程语言中使用正则,可以极大地提高文本的处理能力。
在进行文本处理时,正则解决的问题大概可以分成四类,分别是校验文本内容、提取文本内容、替换文本内容、切割文本内容。在这一节里,我会从功能分类出发,给你讲解在一些常见的编程语言中,如何正确地实现这些功能。

1. 校验文本内容

我们先来看一下数据验证,通常我们在网页上输入的手机号、邮箱、日期等,都需要校验。校验的特点在于,整个文本的内容要符合正则,比如要求输入 6 位数字的时候,输入 123456abc 就是不符合要求的。
下面我们以验证日期格式年月日为例子来讲解,比如 2020-01-01,我们使用正则\d{4}-\d{2}-\d{2} 来验证。

Python

在 Python 中,正则的包名是 re,验证文本可以使用 re.match 或 re.search 的方法,这两个方法的区别在于,re.match 是从开头匹配的,re.search 是从文本中找子串。下面是详细的解释:
# 测试环境 Python3
>>> import re
>>> re.match(r'\d{4}-\d{2}-\d{2}', '2020-06-01')
<re.Match object; span=(0, 10), match='2020-06-01'>
# 这个输出是匹配到了,范围是从下标0到下标10,匹配结果是2020-06-01
# re.search 输出结果也是类似的
在 Python 中,校验文本是否匹配的正确方式如下所示
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《正则表达式入门课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(2)

  • 134
    "xxx#163.com".replace(/#/,'@')

    作者回复: 赞,这真的是一个特别好的方法。
    遇到本文思考题目类似的问题,很多同学可能一上来就想,我要一展身手,想出一个正则,兼容 @ 和 # 两种情况,当然肯定能写出来,也不难。
    但提前对文本进行预处理,把杂乱的文本清洗干净,然后再使用正则来提取是一种非常好的思路,通常也是这么做的,比费尽心思想着怎么用正则来兼容各种情况的办法要更好,也更推荐这么做。

    2020-07-06
    1
    4
  • Robot
    public static void main(String[] args) {
    Pattern pattern = Pattern.compile("[a-zA-Z0-9]+(?:[.-][a-zA-Z0-9]+)*#[a-zA-Z0-9]+(?:[.-][a-zA-Z0-9]+)*\\" +
    ".[a-zA-Z]+");

    String str = "A spirited debate ensued. sd.xxx#gmail.com You may find it entertaining and educational to " +
    "follow all the various threads. However, I want to focus on one of Mark’s replies. He tweeted about a" +
    " blog he had yanleichang-3#vip.163.com written back in 2018. I encourage you to read it. You’ll learn" +
    " something about testing, static typing, and Haskell. You’ll also learn something about how to debate" +
    " with good-job#qq.com someone in the future by posting your refutation in the think#163.com";

    Matcher matcher = pattern.matcher(str);

    while (matcher.find()) {
    System.out.println(matcher.group().replace('#','@'));
    }

    作者回复: 可以的,其实题目的本意是兼容文本中有 # 和 @ 两种情况

    2020-07-06
收起评论
2
返回
顶部