正则表达式_正则正则表达式正则表达式多个 手机号码解除绑定 - CSDN
正则表达式 订阅
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。 展开全文
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。
信息
代码简写
regex、regexp或RE
行业归属
计算机科学
作    用
用来检索、替换那些符合某个模式(规则)的文本
中文名
正则表达式
外文名
Regular Expression
别    称
规则表达式
正则表达式概念
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
收起全文
  • Python-正则表达式

    2019-10-31 15:05:33
    正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本...
  • 在做项目的过程中,使用正则表达式来匹配一段文本中的特定种类字符,是比较常用的一种方式,下面是对常用的正则匹配做了一个归纳整理。 1、匹配中文:[\u4e00-\u9fa5] 2、英文字母:[a-zA-Z] 3、数字:[0-9] 4、匹配...

    在做项目的过程中,使用正则表达式来匹配一段文本中的特定种类字符,是比较常用的一种方式,下面是对常用的正则匹配做了一个归纳整理。

    1、匹配中文:[\u4e00-\u9fa5]

    2、英文字母:[a-zA-Z]

    3、数字:[0-9]

    4、匹配中文,英文字母和数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$
    同时判断输入长度:
    [\u4e00-\u9fa5_a-zA-Z0-9_]{4,10}

    5、
    (?!_)  不能以_开头
    (?!.*?_$)  不能以_结尾
    [a-zA-Z0-9_\u4e00-\u9fa5]+  至少一个汉字、数字、字母、下划线
    $  与字符串结束的地方匹配

    6、只含有汉字、数字、字母、下划线,下划线位置不限:
    ^[a-zA-Z0-9_\u4e00-\u9fa5]+$

    7、由数字、26个英文字母或者下划线组成的字符串
    ^\w+$

    8、2~4个汉字
    "^[\u4E00-\u9FA5]{2,4}$";

    9、最长不得超过7个汉字,或14个字节(数字,字母和下划线)正则表达式
    ^[\u4e00-\u9fa5]{1,7}$|^[\dA-Za-z_]{1,14}$
     

    10、匹配双字节字符(包括汉字在内):[^x00-xff]
    评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

    11、匹配空白行的正则表达式:ns*r
    评注:可以用来删除空白行

    12、匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
    评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

    13、匹配首尾空白字符的正则表达式:^s*|s*$
    评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

    14、匹配Email地址的正则表达式:^[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$

    评注:表单验证时很实用

    15、手机号:^((13[0-9])|(14[0-9])|(15[0-9])|(17[0-9])|(18[0-9]))\d{8}$

    16、身份证:(^\d{15}$)|(^\d{17}([0-9]|X|x)$)

    17、匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
    评注:网上流传的版本功能很有限,上面这个基本可以满足需求

    18、匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
    评注:表单验证时很实用


    19、匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
    评注:匹配形式如 0511-4405222 或 021-87888822

    20、匹配腾讯QQ号:[1-9][0-9]{4,}
    评注:腾讯QQ号从10000开始

    21、匹配中国邮政编码:[1-9]d{5}(?!d)
    评注:中国邮政编码为6位数字

    22、匹配身份证:d{15}|d{18}
    评注:中国的身份证为15位或18位

    23、匹配ip地址:d+.d+.d+.d+
    评注:提取ip地址时有用


    24、匹配特定数字:
    ^[1-9]d*$    //匹配正整数
    ^-[1-9]d*$   //匹配负整数
    ^-?[1-9]d*$   //匹配整数
    ^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
    ^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
    ^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
    ^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
    ^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
    ^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
    ^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
    评注:处理大量数据时有用,具体应用时注意修正


    25、匹配特定字符串:
    ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
    ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
    ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
    ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
    ^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串

    26、
    在使用RegularExpressionValidator验证控件时的验证功能及其验证表达式介绍如下:
    只能输入数字:“^[0-9]*$”
    只能输入n位的数字:“^d{n}$”
    只能输入至少n位数字:“^d{n,}$”
    只能输入m-n位的数字:“^d{m,n}$”
    只能输入零和非零开头的数字:“^(0|[1-9][0-9]*)$”
    只能输入有两位小数的正实数:“^[0-9]+(.[0-9]{2})?$”
    只能输入有1-3位小数的正实数:“^[0-9]+(.[0-9]{1,3})?$”
    只能输入非零的正整数:“^+?[1-9][0-9]*$”
    只能输入非零的负整数:“^-[1-9][0-9]*$”
    只能输入长度为3的字符:“^.{3}$”
    只能输入由26个英文字母组成的字符串:“^[A-Za-z]+$”
    只能输入由26个大写英文字母组成的字符串:“^[A-Z]+$”
    只能输入由26个小写英文字母组成的字符串:“^[a-z]+$”
    只能输入由数字和26个英文字母组成的字符串:“^[A-Za-z0-9]+$”
    只能输入由数字、26个英文字母或者下划线组成的字符串:“^w+$”
    验证用户密码:“^[a-zA-Z]w{5,17}$”正确格式为:以字母开头,长度在6-18之间,
    只能包含字符、数字和下划线。
    验证是否含有^%&',;=?$"等字符:“[^%&',;=?$x22]+”
    只能输入汉字:“^[u4e00-u9fa5],{0,}$”
    验证Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$”
    验证InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$”
    验证身份证号(15位或18位数字):“^d{15}|d{}18$”
    验证一年的12个月:“^(0?[1-9]|1[0-2])$”正确格式为:“01”-“09”和“1”“12”
    验证一个月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$”
    正确格式为:“01”“09”和“1”“31”。
    匹配中文字符的正则表达式: [u4e00-u9fa5]
    匹配双字节字符(包括汉字在内):[^x00-xff]
    匹配空行的正则表达式:n[s| ]*r
    匹配HTML标记的正则表达式:/<(.*)>.*|<(.*) />/
    匹配首尾空格的正则表达式:(^s*)|(s*$)
    匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
    匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?

     

    展开全文
  • 本门课程主要讲解正则表达式的引用场景和一些基础用法,让大家对正则表达式有一个清晰地认识。 为什么需要掌握正则表达式正则表达式非常灵活、而且功能非常强大,它可以迅速地用极简单的...
  • 正则表达式

    2019-08-26 16:21:48
    文章目录正则表达式简介正则表达式匹配规则re模块compile 函数Pattern 对象Match 对象范例常见格式分组位置分组分割批量替换正则案例: 正则表达式简介 为什么要学正则表达式? 实际上爬虫一共就四个主要步骤: ...

    正则表达式简介

    为什么要学正则表达式?
    实际上爬虫一共就四个主要步骤:

    1. 明确目标 (要知道你准备在哪个范围或者网站去搜索)
    2. 爬 (将所有的网站的内容全部爬下来)
    3. 取 (去掉对我们没用处的数据)
    4. 处理数据(按照我们想要的方式存储和使用)

    我们down下了的数据是全部的网页,这些数据 很庞大并且很混乱,大部分的东西使我们不关心的,因此我们需要将之按我们的需要过滤和匹配出来。那么对于文本的过滤或者规则的匹配,最强大的就是正则表达式,是Python爬虫世界里必不可少的神兵利器。

    什么是正则表达式?
    正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
    正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

    在这里插入图片描述

    正则表达式匹配规则

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    对URL地址进行匹配是一个相当困难的任务,其复杂性取决于你想获得多么精确的匹配结果。
    最简单的情况下URL应该匹配的内容有:协议名(http|https),一个主机名,一个可选的端口
    号,一个文件路径。

    在这里插入图片描述
    在这里插入图片描述

    re模块

    正则表达式使用 对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个 r 前缀, e.g. r’chuanzhiboke\t.\tpython’

    re 模块一般使用步骤

    1. 使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象

    2. 通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。

    3. 最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作

    compile 函数

    compile 函数用于编译正则表达式,生成一个 Pattern 对象,它的一般使用形式如下:
    在这里插入图片描述

    Pattern 对象

    正则表达式编译成 Pattern 对象, 可以利用 pattern 的一系列方法对文本进行匹配查找了。
    Pattern 对象的一些常用方法主要有:
    match 方法:从起始位置开始查找,一次匹配 
    search 方法:从任何位置开始查找,一次匹配 
    findall 方法:全部匹配,返回列表 
    finditer 方法:全部匹配,返回迭代器 
    split 方法:分割字符串,返回列表 
    sub 方法:替换
    

    match 方法

    match 方法用于查找字符串的头部(也可以指定起始位置),它是一次匹配,只要找到了一个匹配的结果就
    返回, 而不是查找所有匹配的结果。它的一般使用形式:mach(string[,pos[,endpos]])
    string 待匹配的字符串
    pos 字符串的起始位置, 默认值是 0
    endpos 字符串的终点位置, 默认值是 len (字符串长度)
    

    Match 对象

    group([group1, …]) 方法用于获得一个或多个分组匹配的字符串,当要获得整个匹配的子串时,可直接使用 group() 或 group(0); 
    
    start([group]) 方法用于获取分组匹配的子串在整个字符串中的起始位置(子串第一个字符的索引),参数默认 值为 0; 
    
    end([group]) 方法用于获取分组匹配的子串在整个字符串中的结束位置(子串最后一个字符的索引+1),参数 默认值为 0; 
    
    span([group]) 方法返回 (start(group), end(group))。
    

    search 方法
    search 方法用于查找字符串的任何位置,它也是一次匹配,只要找到了一个匹配的结果就返回,而不是查找所有 匹配的结果,它的一般使用形式如下:
    当匹配成功时,返回一个 Match 对象,如果没有匹配上,则返回 None。

    findall 方法与finditer 方法
    findall方法搜索整个字符串,获得所有匹配的结果。使用形式如下:
    findall(string[,pos[,endpos]])
    finditer方法的行为跟findall的行为类似,也是搜索整个字符串,获得所有匹配的结果。但它返回一个顺序访问每一个匹配结果(Match对象)的迭代器。
    split 方法
    split 方法按照能够匹配的子串将字符串分割后返回列表,它的使用形式如下:
    split(string[,maxsplit])
    maxsplit 指定最大分割次数,不指定将全部分割.

    sub方法
    sub 方法用于替换。它的使用形式如下:
    在这里插入图片描述

    repl 可以是字符串也可以是一个函数:
    1). 是字符串,使用 repl 去替换字符串每一个匹配的子串,并返回替换后的字符串,
    2). 如果 repl 是函数,这个方法应当只接受一个参数(Match 对象),并返回一个字符串用于替换.

    count 用于指定最多替换次数,不指定时全部替换。

    匹配中文
    在某些情况下,我们相匹配文本中的汉字,有一点需要注意的是,中文的unicode编码范围,主要在[u4e00-u9fa5],这里主要是因为这个范围不完整,比如没有包括全部中文标点,不过在大部分情况下,应该是够用的。

    贪婪模式与非贪婪模式:abbbc

    1. 贪婪模式:在整个表达式匹配成功的前提下,尽可能多的匹配 ( .* );
    	使用贪婪的数量词的正则表达式 ab* ,匹配结果: abbb。
    	* 决定了尽可能多匹配 b,所以a后面所有的 b 都出现了。
    2. 非贪婪模式:在整个表达式匹配成功的前提下,尽可能少的匹配 ( ? );
    	使用非贪婪的数量词的正则表达式 ab*? ,匹配结果: a。 .*? .+?
    	即使前面有 * ,但是 ? 决定了尽可能少匹配 b,所以没有 b。
    3. Python里数量词默认是贪婪的。
    

    范例

    常见格式

    # 导入正则表达式对应的模块;
    import re
    
    # 定义正则表达式的规则;
    pattern = r'westos'
    # 对正则表达式进行一个编译, 编译后, 匹配速度更快;
    patternObj = re.compile(pattern)
    # 将来要处理的字符串内容;
    text = "hello westos hello world westos"
    # 匹配符合正则规则的所有内容;
    result = patternObj.findall(text)
    print(result)
    

    运行结果:
    在这里插入图片描述

    # 案例1: 匹配所有的qq邮箱, username@qq.com, 其中username必须是字母数字或者下划线, 次数为2-12个之间;
    import re
    
    pattern1 = r'\s\w{2,12}@qq\.com'
    text = ' westos@qq.com  hello@qq.com  dhwehfhjrefhjrehfuhregiuhgggggggggggggiu@qq.com'
    patternObj = re.compile(pattern1)
    result = patternObj.findall(text)
    print(result)
    
    # 案例2:
    #     北美电话的常用格式:(eg: 2703877865)
    #             前3位: 第一位是区号以2~9开头 , 第2位是0~8, 第三位数字可任意;
    #             中间三位数字:第一位是交换机号, 以2~9开头, 后面两位任意
    #             最后四位数字: 数字不做限制;
    pattern2 = r'\(?[2-9][0-8]\d\)?[-\.\s]?[2-9]\d{2}[-\.\s]?\d{4}'
    text = '(323)4567890'
    patternObj = re.compile(pattern2)
    result = patternObj.findall(text)
    print(result)
    

    运行结果:
    在这里插入图片描述

    分组

    import re
    
    """
    http://www.baidu.com
    https://www.baidu.com
    ftp://www.baidu.com
    """
    # | 或者
    # ()分组, 如果有分组, 只返回分组里面匹配到的内容;
    # 匹配http和https协议的URL地址;
    # r:代表规则为原生字符串, 一般情况下\代表转义的意思, 如果匹配的规则里面包含\时, 要写成\\, 而有了r, 就不用\\了.
    URLpattern = r'((http|https)://(\w+\.\w+\.\w+))'
    # 匹配http和https协议的URL地址;
    # URLpattern = 'https?://\w+\.\w+\.\w+'
    patternObj = re.compile(URLpattern)
    text = 'http://www.baidu.com https://www.baidu.com ftp://www.baidu.com'
    result = patternObj.findall(text)
    print(result)
    

    运行结果:
    在这里插入图片描述

    位置分组

    import  re
    
    html = '<html><p>hello python</p></html>'
    # r:原生字符串, \代表转义, \\如果没有r时必须用\\代表\字符串;
    """
    <(.*)>: 第一个分组
    <(.*)>: 第2个分组
    (.*): 第3个分组
    </\2>: \2的位置必须和第二个分组的内容保持一致, 否则不匹配;
    </\1>: \1的位置必须和第1个分组的内容保持一致, 否则不匹配;
    """
    pattern = r'<(.*)><(.*)>(.*)</\2></\1>'
    patternObj = re.compile(pattern)
    result = patternObj.findall(html)
    print(result)
    

    运行结果:
    在这里插入图片描述

    分割

    import re
    # 需求: 拿出运算操作中所有的数字
    text = '1+3+5*10-8'
    patternObj = re.compile(r'\+|-|\*|/')
    # maxsplit=最大分割次数;
    result = patternObj.split(text, maxsplit=4)
    print(result)
    

    运行结果:
    在这里插入图片描述

    批量替换

    """
    sub 方法用于替换。它的使用形式如下:
    
    """
    import  re
    text = "本文章点赞数为100, 转发数为20"
    patternObj = re.compile(r'\d+')
    # 将text文本信息中符合patternObj规则的内容替换为0;
    result = patternObj.sub('0' , text)
    print(result)
    
    # 需求: 匹配到的所有数值+1
    
    def addNum(matchObj):
        """对匹配到的内容+1"""
        if matchObj:
            # 目前num时一个字符串
            num = matchObj.group()
            # 在原有基础上加1 , num时数值类型
            num = int(num) + 1
            return str(num)
    
    
    def add_perfix(matchObj):
        if matchObj:
            return '1002' + matchObj.group()
    
    result = patternObj.sub(addNum, text)
    print(result)
    
    result = patternObj.sub(add_perfix, text)
    print(result)
    

    运行结果:
    在这里插入图片描述

    正则案例:

    """
    西刺代理IP定向爬虫
        需求分析: 获取代理的IP和端口
    """
    import re
    
    import requests
    # User-Agent随机选择代理模块;
    from fake_useragent import  UserAgent
    # 线程池
    from concurrent.futures import  ThreadPoolExecutor
    
    
    def get_content(url):
        """数据采集"""
        try:
            headers = {
                'User-Agent': ua.random,
    
            }
            response = requests.get(url, headers=headers)
            response.raise_for_status()
            response.encoding = response.apparent_encoding
        except Exception as e:
            print("网页" + url + "爬取错误:", e)
            return  ''
        else:
            # response.text     : 如果普通的页面, 用text, 返回字符串的内容
            # response.content  : 如果不是普通的页面(图片, 视频), 用content, 返回的时二进制内容;
            return  response.text
    
    def html_parser(html):
        """数据解析: IP:PORT"""
        """
        <tr class="odd">
          <td class="country"><img src="//fs.xicidaili.com/images/flag/cn.png" alt="Cn"></td>
          <td>113.89.53.247</td>
          <td>9999</td>
        </tr>
        """
        # 1. 获取每一行代理IP的详细内容;
        # re.S: 表示“.”(不包含外侧双引号,下同)的作用扩展到整个字符串,包括“\n”。
        # .代表除了\n之外的任意单个字符;
        tr_pattern = re.compile(r'<tr class=.*?>(.*?)</tr>', re.S)
        trs = tr_pattern.findall(html)
        # 2. 获取这一行IP代理的ip和port;
        """
         <td class="country"><img src="//fs.xicidaili.com/images/flag/cn.png" alt="Cn"></td>
          <td>113.89.53.247</td>
          <td>9999</td>
        """
        IPpattern = re.compile(r'<td>(\d+\.\d+\.\d+\.\d+)</td>')  # \.代表时真实的点字符串, 进行转义, 否则代表任意单个字符;
        PortPattern = re.compile(r'<td>(\d+)</td>')
        for tr in trs:
            ip = IPpattern.findall(tr)[0]
            port = PortPattern.findall(tr)[0]
            yield  ip, port
    
    
    
    def task(page):
        """
        多线程执行的任务: 数据采集和数据分析, 返回ip和port
        :return:
        """
        print("正在爬取第%d页" %(page))
        url = 'https://www.xicidaili.com/nt/%s' % (page)
        html = get_content(url)
        results = html_parser(html)
        return  results
    
    
    
    if __name__ == '__main__':
        pages = 5
        threadCount = 10
        filename = 'xici.csv'
        # 创建用户代理的对象, 通过random属性随机获取一个User-Agent, 用于反爬虫处理;
        ua = UserAgent()
    
        with ThreadPoolExecutor(threadCount) as pool:
            taskResults = pool.map(task, range(1, pages+1))
    
        fw = open(filename, 'w')
        count = 0
        for taskResult in taskResults:
            for item in taskResult:
                count += 1
                fw.write(",".join(item) + '\n')
                # item: ('121.13.252.61', '41564')
                # print(item)
        print(count)
        fw.close()
    

    运行结果:
    在这里插入图片描述
    保存到xici.csv里
    在这里插入图片描述

    展开全文
  • 正则表达式相关总结

    2020-06-09 22:33:44
    创建正则表达式有两种方法:一种是字面量,格式是写在/ /中,另一种是用构造方法,里面写字符串或者是字符串的变量。 //构造方法 new RegExp('lar exp'); // /正则表达式/


    创建正则表达式有两种方法:一种是字面量,格式是写在/ /中,另一种是用构造方法,里面写字符串或者是字符串的变量。
    小括号就是括号内看成一个整体 ,中括号就是匹配括号内的其中一个”
    正则里面的中括号[]只能匹配其中一个,如果要匹配特定几组字符串的话,那就必须使用小括号()加或|,我还以为在中括号中也能使用或|符号,原来|在中括号里面也是一个字符,并不代表或。[3457]匹配3或者4或者5或者7,而(3457)只匹配3457,若要跟前面一样可以加或(3|4|5|7)。[34|57]匹配3或者4或者|或者5或者7.而(34|57)能匹配34或者57。

    //构造方法
    new RegExp('lar exp');
    //
    /正则表达式/
    

    常用的特殊字符

    \n换行,\t匹配tab键,\x0A也可以表示\n\u0009匹配tab键,
    “\”可以将字符转义,可以将特殊字符转为普通字符,也可给普通字符赋予特殊含义使它变为特殊字符

    特殊转普通示例1:

    var str = '//我是注释';【要匹配/var pattern = /\/\//;
    console.log(pattern.exec(str)); //输出://
    

    特殊转普通示例2:

    var str = '\\\\';【如果要匹配的是\,直接写'\'的话,js会认为是要转义后面的那个引号,会导致报错,所以需要对\进行转义写成\\】
    var pattern = /\\\\/;
    console.log(pattern.exec(str)); //输出:\\,反斜杠也需要转义
    

    普通转特殊示例1:

    var str = '1、html\n2、css\n3、js'; //三行
    var pattern = /\n/;
    console.log(pattern.exec(str)); //输出:\n
    

    普通转特殊示例2:

    var str = ' js';
    var pattern = /\t/; //匹配Tab键,制表符
    console.log(pattern.exec(str)); //输出:" "
    

    普通转特殊示例3:

    var str = 'a\nb';
    var pattern = /\x0A/; //用两个16进制来表示,\x0A是ASCII码中的\n
    var pattern1 = /\x61\x0A\x62/; ASCII码中a是61,b是62
    console.log(pattern.exec(str)); //输出:\n
    console.log(pattern1.exec(str)); //输出:a\nb
    

    普通转特殊示例4:
    【Unicode编码中汉字的范围是\u4e00~\u9fa5】

    //匹配汉字会用到unicode编码
    var str = ' js';
    var pattern = /\u0009/; //\u0009是unicode编码中的Tab键
    console.log(pattern.exec(str)); //输出:“ ”
    

    常用的字符类:

    使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符
    [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符

    /./表示匹配除了换行符之外的所有
    /\./表示匹配小数点
    /\d/表示匹配0-9的数字【/[0-9]/】
    /\D表示匹配除了0-9之外的任意字符【/[^0-9]/】
    /\s/表示匹配空格或者unicode空白符或者制表符tab【/ /或/ /】
    /\S/表示除了空格或者unicode空白符或者制表符tab以外都能匹配
    /\w/表示匹配[a-zA-Z0-9_]/【字母数字下划线】
    /\W/表示匹配[^a-zA-Z0-9_]/

    var str = ' 1';
    var pattern = /[\s\d]/; //因为中括号表示只匹配其中任意一个,所以从数字或空格中选一个匹配,先匹配到谁就输出谁
    console.log(pattern.exec(str)); //输出:" "
    

    正则中的重复量词

    /\d{3}/ 重复3次

    /\d{1,2}/ 最少一次,最多两次(逗号和2中间不能有空格)

    /\d{1,}/ 至少一次,大于等于一 (不能小于等于,只能只写最小不能只写最大–>/\d{,2}/会报错)

    /\d?/ 表示/\d{0,1}/, 0次或1次

    /\d+/ 表示/\d{1,}/,至少1次

    /\d*/ 表示/\d{0,}/, 0次或多次
    字符实际上只能影响紧挨着他的那个表达式,例如/\d*/ 实际上只能匹配到数字的重复多次项
    【匹配零次,也就是说当字符串从左侧开始匹配时,开始不是数字,没有匹配到数字也就是匹配到了0次,所以就可以不继续往下面匹配了(因为可以匹配0次),输出结果是空字符串。
    示例:

    var str ='我家的电话是6930184,地址是北京西城区';
    var pattern_1=/\d*/;
    console.log(pattern_1.exec(str));
    匹配结果:空字符串 ""

    【匹配多次,也就是说当字符串从左侧开始匹配时,符合条件,会往后匹配多个,遇到不符合条件字符时停止匹配,然后,返回匹配到的结果。
    示例:

    var str = '69301840慕课网18401840184';
    var pattern_1 = /\d*/;
    console.log(pattern_1.exec(str));
    匹配结果:"69301840"
    var str = '肯德基豪华午餐:¥15.5!';
    var pattern = /\d+\.?\d*/; //应对多种不确定情况
    console.log(pattern.exec(str)); //返回:15.5
    

    非贪婪重复

    “?”表示匹配0次或一次
    匹配字符会尽可能多匹配,只要在后面加上“?”就可以停止贪婪重复
    非贪婪重复在条件允许的情况下会尽可能的少匹配

    语法:
    var str = 'aaab';
    var pattern = /a{0}?/;
    //var pattern = /a+?/;
    语法:
    var str = 'aaab';
    var pattern = /a+?b/;
    console.log(pattern.exec(str)); //返回:aaab','条件允许才少匹配
    语法:
    var str = '<td><p>a</p></td><td><p>a</p></td>';
    var pattern = /<td>.*?<\/td>/;
    console.log(pattern.exec(str)); //非贪婪返回:第一段<td>
    

    分组

    1、“()”可以用括号将匹配字符归为一组,还会自动捕获一次括号内容

    var str='abab';
    var pattern=/ab+/; //加号只影响字符b,匹配结果是ab而不是abab;
    var pattern=/(ab)+/; //匹配结果是['abab','ab'];
    

    2、先忽略括号运行一次,然后再自动捕获一遍括号内容,按顺序排列

    var str='abcd';
    var pattern=/(ab)c/; //将ab单独捕获,exec结果是['abc','ab']【捕获性分组】
    var pattern=/(a(b(c)))/; //['abc','abc','bc','c']
    

    3、“?:”可以放在括号里取消自动捕获,但无法与\1一起用
    【非捕获性分组】

    //不用将ab捕获
    var pattern=/(?:ab)c/;//,exec结果是['abc']
    
    

    引用:

    4、“\1”代表第一个分组,以此类推

    //\1代表第一个分组,如果有第二个分组可以用\2来代表第二个分组。
    var str='ab cd ab';
    var pattern =/(ab) cd \1/; //exec结果是['ab cd ab','ab']
    

    实际应用↓:

    //【保证后面的标签名和前面的标签名一样】
    var str='<p><a>adffdafd</a></p>';
    var pattern= /<([a-zA-Z]+)>(.*?)<\/\1>/;
    //exec结果是['<p><a>adffdafd</a></p>','p','<a>adffdafd</a>']
    

    5、解析器会在控制台中自动给返回的数组添加两个属性:indexinput
    index:表示匹配到的值在字符串中的位置,从0开始
    input:存放被匹配到的字符串,也就是数组中这个位置的内容
    指定匹配位置
    首匹配^:
    var str = ‘html js’;
    var pattern = /^js/;【j必须在行首】
    注意:在字符类中([])是取反的意思

    匹配位置

    尾匹配$:

    var str = 'html js';
    var pattern = /js$/;//【s必须在行尾】
    

    匹配数字:/^\d+$/匹配的全是数字,匹配成功则说明全是数字
    逆向思考:/\D/ 这个正则找到的是除数字外的所有字符,有匹配结果说明不全是数字并且将非数字返回

    var pattern=/[^iii]/; //取反
    var pattern=/^///首位匹配
    

    1、“\b”匹配单词的边界,在匹配字符前写表示匹配行首,反之表示匹配行尾
    2、“(?=)”前瞻性匹配,只有被匹配字符后面跟的是指定字符时才匹配

     var str="Java 是一门很好的编程语言,
     JavaScript是非常好、非常实用的脚本语言!"
     //匹配 JavaScript中的Java
     var pattern = /Java(?=Script)/;
     console.log(pattern.exec(str));
    

    3、“(?!)”负向前瞻性匹配,被匹配字符后面跟的是指定字符时不匹配

    匹配模式

    g 全局匹配
    pattern.lastIndex属性,初始值为0,普通模式(未开启全局匹配模式)时是一直为0,开启全局匹配模式后,指向匹配到的字符的下一个位置,当全部匹配完后,会重置为0
    RegExp对象的实例属性和构造函数属性

    实例属性

    pattern=/js/ig;
    pattern.ignoreCase 返回布尔值 判定有没i
    pattern.global 返回布尔值 判定有没g
    pattern.multiline 返回布尔值 判定有没m
    pattern.source 返回字面量形式所对应的字符串 --> js
    这些属性的用处不大
    

    pattern.lastIndex 这个比较重要
    它默认是0,全局匹配下是匹配一次后下一个位置的索引

    构造函数属性【更不常用,因为不同浏览器实现结果不太一样,有的浏览器根本不能实现,它们的支持情况也不一样】 RegExp.input
    ==RegExp.==RegExp[_==RegExp['’](只有js中合法的标识符【字母、开头,后面字母、_、、数字】我们才可以用‘.’来表示,所有用‘.’来表示的都可以用‘[]’,但是所有用[]来表示的就不一定能用‘.’)
    RegExp.lastMatch最近一次匹配到的字符 == RegExp[’KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲']【因为&不是合法的所以只能…`’]【shift+TabRegExp.rightContext==RegExp["后面跟着的是英文状态下的波浪号(shift+Tab键上面的那个符号)】 RegExp.rightContext上次匹配右边剩余的字符==RegExp["’"]【RegExp.lastParen==RegExp[后面跟着一个引号,因为外面就是一个引号,所以必须写成外面双引号里面单引号】 RegExp.lastParen上次匹配到的子选项==RegExp['+’]

    console.log(RegExp.$1);返回第一个分组(常用, 上面的不常用)
    

    常用的正则表达式

    中文:/[\u4e00-\u9fa5]/
    整数的正则表达式:/0|-?[1-9]\d*/
    正整数:/[1-9]\d*/ 正整数的第一位首先不能为0
    正整数和负整数的匹配:/-?[1-9]\d*/
    匹配指定位置class样式值:"\\b"+className+"\\b" 单独的单词
    除去数字字母特殊字符:/[^a-zA-Z0-9\u4e00-\u9fa5 ]
    "(^|\\s+)"+className+"(\\s+|$)" 表示该属性值位于首部或尾部 或前 或后 有1+空格;
    1、QQ号
    规则:全是数字、首位不能为0、最少是5位、目前最多只有11位
    /^[1-9]\d{4,10}$/
    /^[1-9]\d{4,}$/
    2、昵称
    例如:慕课网
    规则:昵称为2-18位,中英文、数字及下划线
    /^[\u4e00-\u9fa5a-zA-Z0-9_]{2,18}$/
    /^[\u4e00-\u9fa5\w]{2,18}$/
    3、密码
    例如:慕课网
    规则:6-16位密码,区分大小写,不能用空格(空白字符)
    /^\S{6,16}$/

    /^[\w~!@#$%^\[\]]{6,16}$/
    

    4/html

    var str = '<p class="odd" id="odd">sss</p>';
    var str2 = '<p class="odd" id="odd" value=">" >sss</p>';
    var pattern = /<\/?[a-zA-Z]+(\s+[a-zA-Z]+=".*")*>/g;
    var pattern2 = /<[^>]+>/g;//内部没有>括号,但是可能有人在属性内命名>
    var pattern3 = /<(?:[^'">]|"[^"]*"|'[^']*')*>/g;//非捕获性分组
    var pattern4 = /<(?:[^>'"]|(['"])[^"']*\1)*>/g;//非捕获性分组
    console.log(pattern)
    console.log(str.match(pattern)); //["<p class="odd" id="odd">", "</p>"]
    console.log(str.match(pattern2));// ["<p class="odd" id="odd">", "</p>"]
    console.log(str2.match(pattern3));// ["<p class="odd" id="odd">", "</p>"]
    console.log(str2.match(pattern4));// ["<p class="odd" id="odd">", "</p>"]
    

    正则邮箱验证
    7、邮箱
    邮箱可能的格式
    steady@sina.com
    steady_1@sina.com.cn
    steady_1.abcd.efgh.com@sina.com.qwerty.cn
    可匹配的正则:

    /(?:\w+\.)*\w+@(?:\w+\.)+[a-z]+/i
    

    较复杂的邮箱格式:(包含连字符)
    steady_1.a-bcd.efgh.com@si_n-a.com.qwerty.cn

    /^[a-z0-9]+(?:[._-][a-z0-9]+)*@[a-z0-9]+(?:[._-][a-z0-9]+)*\.[a-z]{2,4}$/i
    

    如果是验证邮箱,记得要加上首^尾KaTeX parse error: Undefined control sequence: \/ at position 17: …配 匹配URL地址: (协议:\̲/̲\/)主机名(:端口号)/(路…/`
    匹配主机名:

    /^([a-z0-9\.|[a-z0-9][-a-z0-9]*[a-z0-9]\.)*([a-z)+$/i
    

    一些小问题

    正则表达式在匹配的时候,会在字符串中从前往后一 一的匹配,直到找到能匹配上的字符,此正则表达式在字符串中的第一位就找到了自己要找的其中一个c,因此就不会再往下继续找。

    var str  =" c java javascript c++ html";
    var pattern = /java|c|c\+\+|html/;
    document.write(pattern.exec(str));//c
    
    展开全文
  • 正则表达式[^?&=]

    2019-07-05 11:54:55
    1.中括号里加上尖号是“非”的意思 非字母的写法 [^a-zA-Z] 获取url请求中参数的值。 params.param=params.param.replace(/([^?&=]+)=([^?&=]*)/g,function (ars, a, b) { if(/[\u4e00-\u9fa5]+/g.test(b)...

    1.中括号里加上尖号是“非”的意思

    非字母的写法 [^a-zA-Z]

    获取url请求中参数的值。

    
    params.param=params.param.replace(/([^?&=]+)=([^?&=]*)/g,function (ars, a, b) {
      if(/[\u4e00-\u9fa5]+/g.test(b))b=encodeURI(b)//如果是中文 转码
      return a+"="+b;
    })
    
    
    
    其中,//g内的是正则,中括号中的上尖号代表非,[^],所以[^?&=]代表除了?&=之外的任意字符,
    [^?&=]+代表:‘至少一个除了?&=之外的任意字符’。等号=右边[^?&=]*代表0或者多个‘除了?&=之外的任意字符’
    
    /([^?&=]+)=([^?&=]*)/g
    

    所以,下面这个url请求,匹配的结果是: roleName=测试角色名 、roleId=331 、 roleDesc=测试描述
    http://XXXXXX/editRole?roleName=测试角色名&roleId=331&roleDesc=测试描述&callback=__jp27

    展开全文
  • 正则表达式|

    2018-08-07 13:48:08
    精通正则表达式&gt;&gt; 一书。 发现了很多自己不了解的东西(汗颜阿,自己知道的东西太少了!)。其中"|"就是其中一个。不懂就补吧,所以就有了下面的一点记录。 2. 用途 “| ” 他的意思...
  • 一、简介1、什么是正则表达式正则表达式本身就是一种语言,这在其它语言是通用的。正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个...
  • 明白*和*?的区别就好了 *是贪婪模式,会尽可能匹配更多的字符 而*?是非贪婪模式 会尽量匹配少的字符 例子 假设字符串是121212 \d*2 会匹配到整个字符串 121212 而 \d*?2 会捕获到3个匹配组 分别是 12 12 12 ...
  • 原文链接:...\w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下匹配中文字符的正则表达式: [\u4e00-\u9fa5]或许你也需要匹配双字节字符,中文也是双...
  • 常用正则表达式—邮箱(Email)本文针对有一点正则基础的同学,如果你对正则一无所知,请移步“正则表达式30分钟入门教程”学习。要验证一个字符串是否为邮箱的话,首先要了解邮箱账号的格式。我尝试过在网上找出一...
  • 正则表达式匹配URL

    2012-08-27 16:35:54
    最近在做一些关于URL匹配的项目,本来对正则表达式了解的不多,上网搜索了好多前辈写的正则表达式,发现很少能被我使用的,现将我自己写的正则表达式贴出来,供大家参考。 %% 首先,正则表达式:  String check ...
  • 正则表达式的强大众所周知,它令程序员的头痛程度也数一数二的。最近我发现了一个网站,txt2re,能够自动为你生成正则表达式,而且很灵活,在这里推荐一下。 网址: http://www.txt2re.com/ http://txt2re.com/ ...
  • 正则表达式 linux shell

    2014-07-18 10:48:11
    正则表达式 热身 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 例如 grep, expr, sed , ...
  • 之前一直不太会写正则表达式,很多要用到正则表达式的都直接百度,像上次要用正则表达式验证是否是合法的ip地址,然后就上网找,结果就是没找到一个对的,今天就为大家贡献一下,写个对的,并做一下解析。...
  • 正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。 匹配中文字符的正则表达式: [\u4e00-\u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了...
  • 正数的正则表达式(包括0,小数保留两位):^((0{1}\.\d{1,2})|([1-9]\d*\.{1}\d{1,2})|([1-9]+\d*)|0)$ 正数的正则表达式(不包括0,小数保留两位):^((0{1}\.\d{1,2})|([1-9]\d*\.{1}\d{1,2})|([1-9]+\d*))$ 正...
  • 最近做了几个项目,发现正则表达式用得越来越多了。我个人的习惯是,能通过查手册获取的东西绝不死记硬背,虽然大多数技术网站都搜罗了一堆Javascript正则表达式的用法,但我还是想整理一份更有实战意义的手册。说白...
  • 在网页开发中可能会遇到需要对在页面输入的ip和端口进行正确性验证,那么正则表达式就是最有力的工具: 1:ip的正则表达式: 格式是由“.”分割的四部分,每部分的范围是0-255; 每段的正则可以分几部分来写:200...
  • 正则表达式基础讲解 一、什么是正则表达式 在网络爬虫将网页内容爬取的时候,有一个关键的步骤就是对我们关注的信息进行提取,正则表达式就是用于信息筛选提取的强大工具,并且学习简单,所以建议大家掌握。 ...
1 2 3 4 5 ... 20
收藏数 537,708
精华内容 215,083
关键字:

正则表达式