正则表达式(Regular Expression)

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

为什么需要正则表达式

文本的复杂处理

正则表达式的优势和用途

一种强大而灵活的文本处理工具

大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式

正则表达式定义

正如名字一样时描述了一个规则,通过这个规则可以匹配一类字符串

学习正则表达式很大程度上就是学习正则表达式的语法规则

开发中使用正则表达式的流程

分析所要匹配的数据,写出测试用的典型数据

在工具软件中进行匹配测试

在程序中调用通过测试的正则表达式

正则表达式语法

普通字符

字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

简单的转义字符

  • \n :代表换行符
  • \t :制表符
  • \\ :代表\本身
  • \^,\$,\(,\),\{,\},\?,\+,\*,\|,\[,\] :匹配这些字符本身

标准字符集合

能够与‘多种字符’匹配的表达式

注意区分大小写,大写是相反的意思

  • \d :任意一个数字,0-9中的任意一个
  • \w :任意一个字母或数字或下划线,也就是A-Z,a-z,0-9,_,中任意一个
  • \s :包括空格、制表符、换行符等空白字符的其中任意一个
  • . :小数点可以匹配任意一个字符(除了换行符),如果要匹配包括“\n”在内的所有字符,一般用[\s\S]

自定义字符集合

方括号匹配方式,能够匹配方括号中任意一个字符

  • [ab5@] :匹配"a",“b”,“5"或”@"
  • [^abc] :匹配非"a","b,"c"之外的任意一个字符
  • [f-k] :匹配"f"-"k"之间的任意一个字母
  • [^a-f0-3] :匹配"a"-“f”,“0”-"3"之外的任何一个字符

正则表达式的特殊符号,被包含到中括号中,则失去了特殊意义,除了^,-之外

标准字符集合,除小数点外,如果被包含于中括号,自定义字符集合将包含该集合。如

[\d.\-+]将匹配:数字、小数点、-、+

量词

修饰匹配次数的特殊符号,修饰的是前一个表达式

  • {n} :表达式重复n次
  • {m,n} :表达式至少重组m次,最多重复n次
  • {m,} :表达式至少重复m次
  • ? :匹配表达式0次或1次,相当于{0,1}
  • + :表达式至少出现一次,相当于{1,}
  • * :表达式出现或者出现多次,相当于{0,}

匹配次数的贪婪模式:匹配的字符越多越好(默认)

匹配次数的非贪婪模式:匹配的字符越少越好,修饰匹配次数的特殊符号后再加上一个"?"

\d\d{6}其中只是对第二个的\d匹配6次,总共匹配7次

非贪婪:

字符边界 (零宽度)

匹配的是满足条件的位置,而不是字符

  • ^ :字符串开头
  • $ :字符串结尾开始匹配
  • \b :匹配一个单词的边界,前面的字符和后面的字符不全是\w(字母数字下划线)

匹配模式(针对RegexBuddy软件)

IGNORECASE 忽略大小写模式

匹配时忽略大小写,默认情况下,正则表达式是要区分大小写的

SINGLELINE 单行模式

整个文本看作一个字符串,只有一个开头,一个结尾,是小数点"."可以匹配包含换行符(\n)在内的任意字符

MULTILINE 多行模式

每一行都是一个字符串,都有开头和结尾,在指定了MULTULINE之后,如果需要仅匹配字符串开始的和结束的位置,可以使用\A和\Z

选择符和分组

  • | :或,匹配左边或右边
  • () :捕获组,在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰,去匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到,每一对括号会分配一个编号,使用()的捕捉根据左括号的顺序重1开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本
  • (?:Expression) :非捕获组,一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这是可以用非捕获组来抵消使用()带来的副作用。

反向引用(\nnn):每一对()会分配一个编号,使用()的捕捉根据左括号的顺序从1开始自动编号,通过反向引用,可以对分组已捕获的字符串进行引用。引用前面已捕获内容从第一个括号开始一组括号为一个(nnn表示个数)默认为\0

预搜索(零宽断言)对位置的匹配

  • (?=exp):断言自身出现的位置后面能匹配表达式exp
  • (?<=exp):断言自身出现的位置的前面能匹配表达式exp
  • (?!exp):断言此位置的后面不能匹配表达式exp
  • (?<!exp):断言此位置的前面不能匹配表达式exp

断言后匹配的本身不计入匹配的字符串

例:电话号码验证:

邮箱验证:

常用正则表达式列表:

Java中使用正则表达式

将正则表达式变为java对象

public class RegTest01 {public static void main(String[] args) {//在:asdasda123wwe12323中,是否符合指定的正则表达式\w+//创建表达式对象Pattern pattern = Pattern.compile("\\w+");//创建Matcher对象:目标字符串Matcher matcher = pattern.matcher("asdasda123wwe12323**asd");System.out.println(matcher.matches());boolean b = matcher.find();//该方法扫描输入的序列,查找与该模式匹配的下一个子序列System.out.println(b);System.out.println(matcher.find());System.out.println(matcher.find());System.out.println(matcher.find());}
}

输出:

输出匹配得到的字符串:

while(matcher.find()) {System.out.println(matcher.group());System.out.println(matcher.group(0));//group(),group(0)匹配整个表达式的子字符串}

测试正则表达式的分组处理:

/*
* 测试正则表达式的分组处理
* */
public class RegTest02 {public static void main(String[] args) {Pattern pattern = Pattern.compile("([a-z]+)([0-9]+)");Matcher matcher = pattern.matcher("asda123***asdada22*sda");while (matcher.find()){System.out.println(matcher.group());//匹配([a-z]+)([0-9]+)System.out.println(matcher.group(1));//即匹配([a-z]+)System.out.println(matcher.group(2));//匹配([0-9]+)}}
}

/*
* 正则表达式在java中常用方法
* */
public class RegTest03 {public static void main(String[] args) {Pattern pattern = Pattern.compile("[0-9]");Matcher matcher = pattern.matcher("asda123***asdada22*sda");//将数字替换String s = matcher.replaceAll("&");System.out.println(s);//使用正则表达式以数字进行分割String s1 = "asda123***asdada22*sda";String[] strings = s1.split("\\d+");System.out.println(Arrays.toString(strings));}
}

输出:

/*
*
* 网络爬虫取链接
* */
public class WebSpiderTest {public static String getUrlContent(String urlStr){StringBuilder sb = new StringBuilder();try {URL url = new URL(urlStr);BufferedReader bf = new BufferedReader(new InputStreamReader(url.openStream()));String temp = "";while ((temp = bf.readLine()) != null){sb.append(temp);}bf.close();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return sb.toString();}public static void main(String[] args) {String regStr = getUrlContent("http://www.baidu.com");Pattern pattern = Pattern.compile("<a[\\s\\S]+?</a>");//取得超链接整个内容Pattern pattern1 = Pattern.compile("(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?");//取得超链接整个内容Matcher matcher = pattern1.matcher(regStr);while (matcher.find()){System.out.println(matcher.group());}}
}

正则表达式(Regular Expression)基本概念及理解相关推荐

  1. 初步了解并使用正则表达式 (REGular EXPression)

    正则表达式(REGular EXPression),正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本.只有掌 ...

  2. java正则表达式及api_JAVA常用API:正则表达式regular expression

    一.正则表达式的概念 正则表达式,regular expression,在代码中通常简写成regex 正则表达式是一个字符串,使用每单个字符串来描述.定义匹配规则,匹配一系列符合某个语法规则的字符串. ...

  3. 正则表达式 匹配点号_Python入门:正则表达式(Regular Expression)

    正则表达式用来干嘛 正则表达式是用来匹配文本的一种语言.别被语言吓到,正则表达式其实非常简单,可能你花2个小时就能用起来,但是你一定会觉得非常强大,像非常厉害的数据爬取,网页爬虫,都要用到正则表达式! ...

  4. oracle的正则表达式(regular expression)简单介绍

    目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境. Oracle 10g正则表达式提高了SQL灵活性.有效的解 ...

  5. 正则表达式Regular Expression

    <编译原理>第三章习题 我们的教材是那本经典的"龙书":<Compiler: Principles, Techniques, and Tools> 灰常灰常 ...

  6. 正则表达式(regular expression)————以Qt为例

    文章目录 1 应用 2 简介 2.1 组成 2.2 特殊字符 2.2.1 匹配多个字符串 2.2.2 替换字符串 2.2.3 统计字符出现次数 2.3 Qt中使用 3 regexp结构集合 3.1 表 ...

  7. Regular Expression:C++正则表达式库(RE库regex)

    正则表达式(Regular Expression)是一种描述字符序列的方法,是处理字符序列的一种强大的计算工具!(字符串的匹配.查找.替换) 1.ECMAScript :ECMA-262规范: ECM ...

  8. php中ip地址的正则表达式,PHP_IP地址正则表达式匹配方法,正则表达式(Regular Expression, - phpStudy...

    IP地址正则表达式匹配方法 正则表达式(Regular Expression,在代码中常简写为regex.regexp或RE)是计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个 ...

  9. 通配符(WildCard)与正则表达式(Regular Expression)

    1.通配符(wildcard)就是万用牌的意思 * 表示匹配任意长度的任意字符 ? 表示匹配一个任意字符 [-]则表示匹配括号中列出的字符中的任意一个 [!..]表示不匹配括号中列出的字符中的任意一个 ...

  10. python 正则表达式(Regular Expression)基础学习笔记

    python 正则表达式(Regular Expression) 正则表达式基础 search():只返回第一个匹配的字符串 findall():将搜寻结果以列表方式返回 import re # 导入 ...

最新文章

  1. PE格式详细讲解4 - 系统篇04|解密系列
  2. LeetCode - 785. Is Graph Bipartite?
  3. dns-prefetch,新打开页面预抓取
  4. SAP实战中Submit的常见用法-调用标准程序
  5. 2021信阳高中高考成绩查询,河南省普通高中综合信息管理系统2021信阳中考成绩查询入口...
  6. html%3ca%3e标签,How do I encode “” in a URL in an HTML attribute value?
  7. ESX与ESXi管理员必备25个命令
  8. LINUX mount -t用法
  9. linux网卡端口绑定bond,Linux下双网卡绑定bond0
  10. 联想i微型计算机怎么拆,联想t410i如何拆机?联想t410i拆机方法【图文】
  11. 应用程序无法正常启动(0xc00007b)
  12. 首个智慧零碳码头:Hightopo参与天津中远海运金风智慧能源管控平台建设
  13. 阿铭Linux_公有云学习笔记20190116
  14. 类似吾爱破解论坛的网站有哪些?破解软件网站合集推荐
  15. 北京药监局考试计算机操作,考科一电脑操作
  16. H5页面自定义标题、链接、描述、图片分享到微信朋友、朋友圈、QQ和QQ空间
  17. linux移除硬盘命令,在Linux中在线添加及移除SCSI硬盘方法
  18. dataframe保存为txt_如何快速将TXT转换为SRT文件
  19. 一文理解 ISO、快门、光圈、曝光概念 以及 光圈、焦距与景深的关系
  20. 电路板级的EMC设计 (2)元件的选择和电路设计技术

热门文章

  1. QT开源网站和相关资料
  2. UFS系列六:UFS设备初始化和启动
  3. 2020央行全面降准,货币政策操作仍有较大空间
  4. 【毕业设计源码】基于JAVA的微信小程序直播在线教育平台
  5. 实验吧-PHP大法-eregi()函数
  6. chrome主页和新标签页被金山毒霸劫持 处理方法
  7. 世界有色金属杂志世界有色金属杂志社世界有色金属编辑部2022年第4期目录
  8. 整合ecshop与discuz论坛
  9. 全自动IC半导体MCU芯片烧录flash大批量生产出货的解决方案分析
  10. 全国哀悼日 网站变灰装(附代码)