正则表达式

  • 介绍
  • 普通字符
  • 标准字符集合
  • 自定义字符集合
  • 量词
  • 字符边界
  • 匹配模式
  • 分组和反向引用
    • 分组
    • 反向引用
  • 预搜索
  • 正则在Java编程中的使用
  • 示例

介绍

正则表达式是用来进行文本的复杂处理的。正则表达式就是定义了一个规则,按照我们定义的规则进行字符串的匹配。大部分的编程语言、数据库、开发环境都支持正则表达式。

普通字符

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

如果想要匹配一些有特殊含义的字符可以使用转义符,比如想要匹配“?”可以写这样的表达式“\?”。

标准字符集合

标准字符集合 含义
\d 匹配任意0~9中的任意一个数字
\w 匹配任意一个字母或数字或下划线
\s 匹配包括空格、制表符、换行符等空白字符中的任意一个
. 可以匹配除了换行符外的任意一个字符

注意区分大小写,大写代表的是相反的含义
比如\D表示匹配除了0~9数字外的任意一个字符。

自定义字符集合

[]方括号内包括多个匹配规则,能够匹配符合[]方括号内任意规则的字符。

表达式 含义
[abcd] 匹配“a”,“b”,“c”,“d”中的任意一个字符
[1-9] 匹配1~9中的任意一个字符
[\^a-g] 匹配a~g外的任意一个字符

上述的例子中有几个知识点
1、[]方括号内的匹配规则间是或的关系,如第一个例子匹配“a”或“b”或符合方括号中其他规则的。
2、“-”表示至,a-z,表示从a至z的所有字符。
3、“^”放在方括号中表示取反。
此外,自定义字符集合还有一些注意
1、除了上述的“^”和“-”外正则表达式的其他特殊符号在[]方括号中失去其特殊含义。
2、除了"."外的标准字符集合在[]方括号中依旧表示该集合,例如,[\d.]表示匹配0~9中的任意一个字符和小数点。

量词

量词顾名思义是用来修饰匹配次数的特殊符号

表达式 含义 例子
{x} 匹配发生x次 a{3}等价于aaa,既匹配一个aaa的子串
{x,y} 匹配发生x至y次 a{1,5},表示匹配一个a至5个a的一个子串
{x,} 匹配至少发生x次 a{1,},表示匹配至少一个a的子串,如aaa,aaaaaaa
匹配发生0次或1次 ?的作用等价于{0,1}
+ 匹配至少发生1次 +的作用等价于{1,}
* 匹配不发生或发生任意次 *等价于{0,}

这是可能会有人有疑问,{x,y}匹配发生x次至y次,如a{1,4}像“aaaaaa”该怎么匹配呢,是匹配4个还是一个呢?
在匹配次数中有两个模式
贪婪模式
匹配的字符越多越好,即上述的例子在贪婪模式下应该匹配4个,默认的模式就是贪婪模式。
非贪婪模式
与贪婪模式相对,匹配的字符越少越好,即上述的例子在非贪婪模式下应该匹配1个。
在量词后面加一个“?”就是非贪婪模式,例如a{1,4}?此时匹配a在符合的量词范围内越少越好。

字符边界

匹配符合某种规则的位置

标记 含义
^ 匹配字符串开始的位置
$ 匹配字符串结束的位置
\b 匹配一个单词边界(前面和后面的字符不全是\w)


此图与普通字符内容处的图片相对比,发现此图只匹配了一个a,这是因为“^”匹配字符串的开始位置,也就是说“^a”匹配的是在字符串开始处的a。

匹配模式

IGNORECASE 忽略大小写模式
正则表达式默认情况下是区分大小写的,在次模式下忽略大小写。
SINGLELINE 单行模式
整个文本看作一个字符串,只有一个开头一个结尾。
MULTILINE 多行模式
每行都是一个字符串,都有开头和结尾。
在多行模式下,如果想要匹配整个文本的开始位置和结束位置用\A和\Z。

分组和反向引用

分组

表达式 作用
| 分支结构,左右两边表达式之间“或”关系,匹配左边或者右边
() 捕获组,把正则表达式的一部分括起来组成一个单元
(?:) 非捕获组,一个表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这时可以用非捕获组来抵消使用()带来的副作用

捕获组可以作为整体来修饰,例如,(aa){2}等价于aaaa。
()捕获组会将括号内的匹配缓存起来,以便反向引用,但如果文本很大的话,大量的缓存会影响性能,此时可用非捕获组(?: ),非捕获组不会保存匹配到的内容。

反向引用

每一对捕获组()会分配一个编号,编号时根据左括号的顺序自动分配的。
(a(b)(d)) 在次表达式中有三个分组,分别是1、(a(b)(d)) 2、(b) 3、(d)
因为捕获组将括号内匹配到的内容缓存了起来,那么可以用反向引用来使用所缓存的内容。
反向引用通过编号来使用,在(a(b)(d)) 中\1表示“abd”,\2表示“b”,\3表示“d”。
反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。

预搜索

预搜索是对位置的匹配,判断某个位置的前后字符是否符合指定的条件,跟之前的字符边界的概念类似,都是对位置的匹配。

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


上述图片中的正则表达式表示只匹配那些以数字结尾的okk。预搜索匹配到的内容并不会计入最终的匹配结果,只是提供一个你所匹配的内容的前后内容的一个限定。

正则在Java编程中的使用

相关的类在:java.util.regex包下面
类Pattren:
正则表达式的编译表示形式
类Matcher:
通过解释Pattren执行匹配操作的引擎

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexpTest1 {public static void main(String[] args) {//表达式对象Pattern p = Pattern.compile("\\b[0-9]+\\b");//创建Matcher对象Matcher m = p.matcher("**123**456**789");//当正则表达式与字符串完全匹配时返回trueboolean b = m.matches();System.out.println(b);/*查找*find()查找下一个与模式匹配的子串,调用一次指针下移一个*group()输出当前find()所指的子串*/while(m.find()){System.out.println(m.group());}/*替换*将匹配到的子串替换成#*/String str = m.replaceAll("#");System.out.println(str);/*分割**/String[] str1 = p.split("**123**456**789");System.out.println(Arrays.toString(str1));}
}

输出结果:

false
123
456
789
**#**#**#
[**, **, **]

示例

验证手机号
String regex = “^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\d{8}$”;
验证QQ号
String regex = “^[1-9][0-9]{4,} $”;

正则表达式 语法详解相关推荐

  1. js 正则中冒号代表什么_javascript中正则表达式语法详解

    好久都没有写博客了,主要是太懒了,尤其是在阳春三月,风和日丽的日子,太阳暖暖的照在身上,真想美美的睡上一觉.就导致了这篇博客拖到现在才开始动笔,javascript的正则这一块也不是什么新的东西,主要 ...

  2. 字符搜索正则表达式语法详解

    工作之余抽点时间出来写写博文,希望对新接触的朋友有帮助.明天在这里和大家一起学习一下字符搜索 作为一个术技,时常会到碰正则表达式相干的西东,很多时候忙着赶进度,都是在网上找一个可以决解的正则表达式,或 ...

  3. 啥叫正则表达式(语法详解)

    常用表达式: "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$ ...

  4. 站长在线Python精讲:Python中正则表达式的语法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中正则表达式的语法详解>.本知识点主要内容有9点:行定位符.元字符.限定符.字符集.排除字符.选择字符.转义字符 ...

  5. php正则如何使用 1,PHP正则表达式使用详解(1)

    PHP正则表达式使用详解(1) 一个正则表达式是一个特定的格式化模式,可以用来找出一个字符串在另一个字符串中的使用情况.几个编程语言,包括Visual Basic,Perl,JavaScript和PH ...

  6. shell中正则表达式详解_Shell if中的正则表达式使用详解

    由于工作需要对用户提交的数据进行验证,这是一个简单的日期正则验证实例,有需要了解的同学可参考. shell中的if语句需要做一个正则判断,查了一下语法记录之. DATEPATTERN="^[ ...

  7. php 字符流在linux,PHP_linux正则表达式awk详解,awk和sed一样是流式编辑器,它 - phpStudy...

    linux正则表达式awk详解 awk和sed一样是流式编辑器,它也是针对文档中的行来操作的,一行一行的去执行.awk比sed更加强大,它能做到sed能做到的,同样也能做到sed不能做到的.awk常用 ...

  8. Python的Xpath介绍和语法详解

    1.简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chrome浏览器 ...

  9. FreeMarker基本语法详解及模板文件的组成(二)

    海浪上次给大家分享了FreeMarker基本语法详解及模板文件的组成(一)海浪今天继续分享FreeMarker基本语法详解及模板文件的组成(二) 3.2 输出变量值<?xml:namespace ...

最新文章

  1. ECLIPSE 如何导入文件?
  2. java 继承 重载_java – 使用继承的重载方法
  3. github创建项目,并提交本地文件
  4. H.264(MPEG-4 AVC)级别(Level)、DPB 与 MaxDpbMbs 详解
  5. python多进程间通信_python多进程间通信代码实例
  6. Spark自定义分区(Partitioner)
  7. SQL Server中的KILL SPID命令
  8. [转]DotNet C#开源资源汇总
  9. 【NOIP2016提高A组模拟9.14】数列编辑器
  10. 黑苹果安装记录(史上最简单的安装教程——小白福利)
  11. k2路由器改无线打印服务器,修改斐讯K2、K3路由器的无线密码【图解】
  12. 许晓斌_Maven实战(五)——自动化Web应用集成测试
  13. 06 暗语转换+ 人民币和卢布币值兑换+星座判断应用
  14. 曲率以及曲率半径推导
  15. 电阻电容电感二极管三极管在电路中的作用
  16. 作为阿里的面试官,我有话想说。
  17. EXPLAIN语法详解
  18. 神经网络阈值是什么意思,神经网络阈值怎么设置
  19. 老版三星笔记本识别不到U盘启动解决办法
  20. Validator框架的使用

热门文章

  1. Matlab常用数学函数和数学运算符
  2. LattePanda 外壳 HOTe-LPA 铝合金外壳
  3. wpdec函数_MATLAB小波函数总结
  4. JasperReport:几个莫名其妙的问题的解决
  5. 删除域控中的一个服务器,删除 Active Directory 域服务
  6. AsyncTask的优缺点
  7. 漏洞复现----6、Jenkins远程命令执行漏洞(CVE-2018-1000861)
  8. golang errors
  9. python之无限浏览网页
  10. JY02调试-无刷电机驱动芯片