正则表达式学习笔记

正则表达式学习笔记

1. 语法

1.1 标准字符集合

  • 注意:要区分大小写,大写是相反的意思
表达式功能
\d匹配任意一个数字,0~9中的任意一个
\w任意一个字母或数字或下划线,也就是AZ、az、0~9
\s包括空格、制表符、换行符等空白字符的任意一个
.小数点可以匹配任意一个字符(除了换行符)
如果要匹配包括"\n"在内的所有字符,一般用[\s\S]

1.2 自定义字符集合

  • [ ]方括号匹配方式,能够匹配方括号里面的任意一个字符
表达式功能
[a1@]匹配“a"、“1”、"@"中的任意一个字符
[^a1@]匹配“a"、“1”、"@"之外的任意一个字符(注意空格)
[a-f1-3]匹配"a""f"和"1""3"中的任意一个字符(包含a、f、1、3)
[^a-f1-3]匹配"a""f"和"1""3"之外的任意一个字符(包含a、f、1、3)
  • [abcdef123][a-f1-3]含义相同
  • 如果正则表达式的特殊符号被包含到中括号[ ]中,则失去特殊意义,除了^-
    • 标准字符集合中,除了小数点之外,如果被包含于中括号中,自定义字符集合将包含该集合。例如
      • [\d.\-+]将匹配:\d表示匹配数字、.匹配小数点本身、-用转义\-表示、+表示本身。

1.3 量词

  • 修饰匹配次数的特殊符号
表达式功能
{n}重复n次
{m,n}至少重复m次,最多重复n次
?匹配表达式0次或1次,相当于{0,1}
+匹配表达式至少1次,相当于{1,}
*表达式不出现或者出现任意次,相当于{0,}
  • 注意:\d\d{6}表示匹配7位数字,而不是12位,而(\d\d){6}才表示匹配12位
  • 贪婪模式–默认情况,匹配次数越多越好
  • 非贪婪模式–匹配字符越少越好,修饰匹配次数的特殊符号后再加上一个?
    • 例如:\d{3,6}?当出现3个数字就匹配一次
  • 举例:a\d?b表示匹配ab或ab中间有一个数字的字符串

1.4 字符边界

  • 本组标记匹配的不是字符而是位置,符合某种条件的位置
表达式功能
^与字符串开始的位置匹配
$与字符串结束的位置匹配
\b匹配一个单词的边界
  • \b匹配:前面的字符和后面的字符不全是\w(字母、数字、下划线)
    • 例如sen\b:匹配sen(n右边有一个空格)、不匹配sen1

1.5 选择符和分组

表达式功能
分支结构:|左右两边表达式之间的”或“关系,匹配左边或右边
捕获组:()1. 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
2. 取匹配结果时,括号中的表达式匹配到的内容可以被单独得到
3. 每一对括号会分配一个编号,使用()的捕获根据左括号的顺序从1开始自动编号。
4. 捕获元素为0的第一个捕获是由整个正则表达式模式匹配的文本
非捕获组(?:表达式)1. 一些表达式中,不得不使用( ),但又不需要保存( )中子表达式匹配的内容,也就是不需要编号,此时可以使用非捕获组。
2. 不影响括号内表达式表达的结果
  • 举例([a-z]{2})\1:可以从goto togo gogo toto中匹配到gogo toto
    • 说明:[a-z]{2}匹配到了2个字符goto,加括号后分组并编号,\1表示引用前面捕获组所捕获的内容

1.6 预搜索(零宽断言)

  • 只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度。
  • 这个位置应该符合某个条件。判断当前位置的前后字符,是否符合指定的条件,但不匹配前后的字符。是对位置的匹配。
  • 正则表达式匹配过程中,如果子表达式匹配到的是字符内容,而非位置,并被保存到最终的匹配结果中,那么就认为这个子表达式是占有字符的。
  • 如果子表达式匹配的仅仅是位置,或者匹配的内容并不保存到最终的匹配结果中,那么就认为这个子表达式是零宽度(是对位置的匹配)的。
  • 占有字符还是零宽度,是针对匹配的内容是否保存到最终的匹配结果中而言的。
表达式功能
(?=表达式)断言此位置的后面能匹配该表达式
(?<=表达式)断言此位置的前面能匹配该表达式
(?!表达式)断言此位置的后面不能匹配该表达式
(?<!表达式)断言此位置的前面不能匹配该表达式
  • 举例
    • 文本:goding doing eating 正则:[a-z]+(?=ing)
    • 匹配到:go do eat ing本身没有匹配到

1.7 正则表达式的匹配模式

  • IGNORECASE 不区分大小写
    • 默认情况下,正则表达式是区分大小写的
  • SINGLELINE 单行模式
    • 将整个文本看成一条字符串,意味着只有一个开头和一个结尾。
    • 使得小数点.:可以匹配包含换行符\n在内的任意字符
  • MULTILINE 多行模式
    • 每行都是一个字符串,都有开头和结尾
    • 在该模式下,如果需要仅匹配整个文本字符串的开始和结束位置,可以使用\A\Z

2. 常见例子

2.1 电话号码验证

  • 要求:
    • 电话号码由数字和 ” - ” 构成
    • 电话号码为7到8位
    • 如果电话号码中包含有区号,那么区号为三位或四位,首位是0.
    • 区号用"-“和其他部分隔开
    • 移动电话号码为11位
    • 11位移动电话号码的第一位和第二位为“13",“15”,“18”
  • 正则:(0\d{2,3}-\d{7,9})|(1[3,5,8]\d{9})

2.2 邮箱验证

  • 要求
    • 用户名:字母、数字、中划线、下划线组成。
    • 有@
    • 网址:字母、小数点、数字组成。
    • 组织域名:2-4位字母组成
    • 不区分大小写
  • 正则:\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}

2.3 其他常见正则

要求正则
身份证\d{17}[\d|x]\d{15}
QQ号[1-9]([0-9]{5,11})
用户名[A-Za-z0-9_\-\u4e00-\u9fa5]+
整数-?[1-9]\d*

3.在开发环境中使用正则

3.1 数据库

  • Mysql5.5以上
  • Oracle10以上
  • 例如
    • select name from user where name REGEXP '.000'(匹配任意字符);

3.2 java中使用正则

  • 相关类位于java.util.regex包下
    • 类Pattern
      • 正则表达式的编译表达形式
      • Pattern p = Pattern.compile(”正则表达式“);//建立正则表达式并启用相应模式
    • 类Mathcher
      • Matcher m = p.matcher(str);//匹配str字符串
        Pattern
      • 正则表达式的编译表达形式
      • Pattern p = Pattern.compile(”正则表达式“);//建立正则表达式并启用相应模式
    • 类Mathcher
      • Matcher m = p.matcher(str);//匹配str字符串
    • 使用str.split("正则表达式");//根据正则切割字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值