zoukankan      html  css  js  c++  java
  • 正则表达式

    不论是前端还是后端,正则表达式好像是大家避不开的一个东西;很多小伙伴纠结于正则表达式很难,很晦涩,我最近看到网上的教程有些比较晦涩,现在我就介绍一下正则表达式,期望大家能够快速入门。

    一直以来我觉得学一个东西需要了解着三个问题:

    1. 为什么会有这个东西 (即:出现问题)
    2. 怎么用这个东西 (即:解决问题)
    3. 这个东西是怎么实现的 (即:怎么解决的问题,一般是进阶或者想深入了解才会去探究,此处忽略)

    针对到正则表达式上就是:

    1. 为什么会有正则表达式
    2. 正则表达式怎么用

    下面就这两个问题我们做讲述

    1. 正则表达式的产生原因

      大家在处理自己的任务的过程中,经常会遇到,想要看一个字符串是否是符合要求的,字符传中是否包含想要的字符串等;例如我想知道用户输入的一个字符串是否是合法的邮箱地址,例如我想看用户输入的字符传中是否包含合法的邮箱地址,例如我想把这串字符串中可能出现的合法邮箱地址给截取出来;这些东西怎么处理呢,有的小伙伴可能会想到直接用所用语言的字符串处理函数,这种直接用所使用语言的字符串处理函数的方式,对于简单的来说还可以接受,但是稍微复杂一些就动辄几十行代码不能解决问题。

      其实在很久之前就有这些问题了,于是一个大神 Ken Thompson 就发明了这个正则表达式用来处理这个问题,他用一个串有特殊含义的字符串来表达一个符合某项特征的字符串,例如他用 d{3}-d{5} 来表示所有三个数字加一个-再加5个数字的字符串,即形如 '333-55555'的字符串。(这类似于 数学中我们用x+y=10,来表示两个和为10的所有数字组合)

      其实一句话总结:正则表达式就是用来匹配处理字符串的工具(一点个人理解:正则表达式大家可以理解为 正确符合我们约定的规则的字符串的表达式,这样可以破解大家对于这个语法糖的恐惧感)

    2. 正则表达式怎么用

      首先正则表达式是一个表达式,我们需要先有意思想要去表达,才能用。

      最简单的,我想写一个只有一个数字的字符串,那怎么用正则表达式表达只有一个数字的字符串呢。 用正则表达式表达应为 d,所以d就是一个正则表达式,它用于表示所有只有一个数字的字符串,我们可以用它来匹陪所有只有一个数字的字符串;

      那么我想表示更复杂的怎么办呢,例如我想表示 一个数字再加一个字母 的字符串,怎么办呢?可以想象的是 可以匹配 一个数字再加一个字母 的正则表达式也是一串特殊字符,只是我们还不知道怎么表达,那么我们只需要进一步了解一下正则表达式的语法就可以了,即我们需要了解一下怎么写正则表达式就可以了。

    正则表达式的入门篇语法:

    1. 所有非正则表达式约定的特殊字符外均表示自己,例如 '34' 表示 所有字符串是'34'的字符串,这显然只有'34'这一个字符串 (对于哪些是正则表达式约定的特殊字符 我们需要通过了解下面语法来记住)

      • 'd' 用于表示一个数字
      • 'w' 用于表示一个字母或数字,例如: '8' , 'x''d'
      • 's' 用于表示一个空格 即 ' '
      • '.' 用于表示一个任意字符,例如: '8' , 'x''d'' ''=''+''{'
    2. 那么我们要表示连续三个数字呢,'ddd' 显然是可以的,那么我要表所示连续100的数字呢,连续 100个'd'就太复杂了,那怎么表示这个呢,类似于正则表达式中的乘法出现了

      'd{3}' 表示连续三个数字组成的字符串,例如 '123''111'

      把这种语法应用于上面4种,情况得到:

      • '3{3}' 用于表示连续三个'3' 组成的字符串,显然只有 '333'
      • 'd{3}' 用于表示连续三个数字 组成的字符串,如: '123''111'
      • 'w{3}' 用于表示连续三个数字或字母组成的字符换,如: 'qw1', '111'
      • '.{3}' 用于表示连续三个任意字符组成的字符串,如: 'xxx''x-1''=+<'

        那么如果我们想要表示x~y个字符组成的字符串呢,于是出现了:

        'd{2,5}' 用于表示2-5个数字组成的字符串 ,如'12', '1234', '34215'

        同理:

      • 'w{1,10}'表示 1-10个字母组成的字符串

      • '.{2-8}' 表示 2-8个任意字符组的字符串,

      • '1{3,7}' 表示 3-7个'1'组成的字符串

        还要一个问题,如果我想表达至少1个,至多到无穷个的字符串呢,正则表达式有没有类似于∞的字符呢,其实是没有的,但有相似的:我们用 '*' 表示 0-∞个,'+'表示1-∞个,如 '3*' , 'd*' 分别表示0到无穷多个3组成的字符串,1到无穷个数字组成的字符串

    3. ok,现在我们已经基本入门了正则表达式了,先在我们稍微在深入一点。首先解决的一个需求是,我们想表达只由1,2,3 这3个数字组成的怎么办:

      • '[123]{3,5}' 表示一个长度为3到5的字符串,其元素只能是元素集合 '1''2''3'的子集,其中 中括号 内表示的是可选的集合

        然后我们想表示只由小写字目a到y这25个字母组成的任意长度字符串怎么办,我需要在正则表达式里写25个字母吗?显然不需要,于是:

      • '[a-y]*' 表示从a到y的集合的子集表示的任意长度的字符串

        你应该常常见到 [0-9a-zA-Z]这种写法,则是表示一个数字或字母,类似于 'w' 了

        另外如果我想匹配一个 由'A'或'B'组成的字符串呢,其实我们用上面的知识可以写出来:'[AB]'则表示一个由A或B组成的一个字符串,有没有更方便的写法呢,于是

      • 'A|B' 出现,表示一个匹配'A'或匹配'B'的表达式

    4. 另外常用的匹配行开始匹配结束的字符是 ^和$

  • 相关阅读:
    hdu 5224 Tom and paper 水题
    2015 UESTC 搜索专题N题 韩爷的梦 hash
    2015 UESTC 搜索专题M题 Palindromic String 马拉车算法
    2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
    2015 UESTC 搜索专题J题 全都是秋实大哥 kmp
    2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
    2015 UESTC 搜索专题E题 吴队长征婚 爆搜
    2015 UESTC 搜索专题D题 基爷的中位数 二分
    2015 UESTC 搜索专题C题 基爷与加法等式 爆搜DFS
    2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
  • 原文地址:https://www.cnblogs.com/javier520/p/11096902.html
Copyright © 2011-2022 走看看