正则表达式随学记录

最基本的

1、元字符:

.  匹配除了换行符以外的任意字符

\w  匹配字母或数字或下划线或汉字

\s  匹配任意的空白字符

\d  匹配数字

\b  匹配单词的开始或结束

^   匹配字符串的开始

$  匹配字符串的结束

2、转移字符:

\  反斜杠,用于查找字符中出现的元字符

如要匹配 \ 就要用 \\

要匹配 *  要用 \*

3、重复

*  重复0次或多次

+  重复1次或更多次

?  重复0次或1次

{n}  重复n次

{n,}  从复n次或更多次

{n,m}  重复n次到m次

4、字符类

[]  把想要匹配的字符集合 放到 中括号当中 如[0-9] 表示的意思 和/d 一样,只匹配一位数字

  [aeiou] 只匹配 原因字母,a 或则 e 或则 i 或则 o 或则 u

  [a-z0-9A-Z] 只匹配字母和数字

5、分支条件

 |

0\d{2}-\d{8}|0\d{3}-\d{7}  匹配两种以连字符分割的电话号码:一种是3位区号8位本地号 020-12345678;一种是4位区号7位本地号

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}  匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号可以用连字号(中横线)或空格分割,也可以没有间隔

6、分组

正则表达式的重复元字符有 ?,* , .这些字符,要重复特定的字符呢?

这就用到分组了 ,也就是小括号()

例如:匹配 xxx.xx.x.xxx  x 代表数字 可以这样写 (\d{3}\.){3}\d{1,3}

有了这个思路就可以写出一个实用的匹配 ,匹配ipv4地址  ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]|[01]?/d/d?)

ip地址中某一段小于100 可以以0开头

7、反义

\W  匹配任意不是字母、数字、下划线、汉字的字符

\S  匹配任意不是空白字符的字符

\D  匹配任意非数字的字符

\B  匹配不是单词开头或结束的位置

[^x]  匹配除了x以外的任意字符

[^aeiou]  匹配除了aeiou这几个字母以外的任意字符

例如: \S+ 匹配不包含空白字符的字符串

    <a[^]+>匹配用尖括号括起来的以a开头的字符串

8、后向引用

匹配一个小括号指定的分组表达式之后,匹配这个子表达式的捕获的文本。关于组号,默认整个表达式的分组号为0,但一般不会显示。分组组号的分配过程要从左向右扫描表达式两遍、第一遍只给未命名分组分配,第二遍只给明明分组分配,因此所有的命名分组都大于未命名分组。

分组命名的语法(?<groupName>\w+)或者 (?‘groupName‘\w+)这样匹配任意字符的分组就被命名为 groupName了。

例如一段字符串"hello hello momoda momoda oh no"

我们写一个这样一个正则表达式  \b(?<Word>\w+)\b\s+\k<Word>

它的意思就是

1先用一个分组匹配一个单词 \b(\w+)\b

2给这个分组命名 为Word  \b(?<Word>\w+)\b

3再匹配一个或多个空格 \b(?<Word>\w+)\b\s+

4反向引用这个分组匹配的内容  \b?<Word>\w+\b\s+\k<Word>

如下图,就能匹配到 hello hello 和 momoda momoda了

分组常用语法:

捕获类:

    exp)  匹配exp,并捕获为本到自动明明组里

    (?<name>exp)  匹配exp,并捕获文本到名称为name的分组里,也可以写成(?‘name‘exp)

    (?:exp)    匹配exp,不捕获匹配的文本,也不给此分组分配组号

零宽断言类:

    (?=exp)  匹配exp前面的位置

    (?<=exp)  匹配exp后面的位置

    (?!exp)  匹配后面跟的不是exp的位置

    (?<!exp)  匹配前面不是exp的位置

注释类:

    (?#comment)  不会对正则表达式产生任何影响

9、零宽度断言

  用于查找匹配内容之后的东西

  (?=exp) 也叫 零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp

  比如:\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),例如查找 "I am singing while you are dancing."时,它会匹配到sing 和 danc  . \b\w+(ing\b)匹配以ing结尾的单词

  (?<=exp) 也叫 零宽度正回顾后发断言,它断言自身出现的位置前面能匹配表达式exp

  比如:(?<=\bre)\w+\b 会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找readin a book 时它匹配ading.

10、负向零宽度

  用于查找匹配内容之前的东西

  (?!exp)  零宽度负预测先行断言, 它断言此位置的后面不能匹配表达式exp

例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字。

     \b((?!abc)\w)+\b  匹配不包含连续字符串abc的单词

  (?<!exp)  零宽度负回顾后发断言 ,来断言此位置的前面不能匹配表达式exp

例如:(?<![a-z])\d{7} 匹配前面不是小写字母的七位数字

11、贪婪与懒惰

  正则表达式通常情况下,都是尽可能多的匹配字符,如:a.*b,它会匹配最长的以a开始的,以b结束的字符串,如 用它来搜索aabbab的话,它会匹配整个字符串 aabbab,这就是贪婪。

有时我们跟需要匹配尽量少的字符,(好像是让 * ,+  这些元字符的的权限变小了)只需要在 正则表达式前面加上一个问号?。

如 a.*?b 匹配最短的,以a开始,以b结束的字符串。如果用它匹配 aabab ,则得到 aab  和 ab

懒惰限定:

    *?    重复任意次,但尽可能少重复

    +?    重复1次或跟多次,但尽可能少重复

    ??    重复0次或1次,但尽可能少重复

    {n,m}?  重复n到m次,但尽肯能少重复

    {n,}?    重复n次以上,但尽可能少重复

12、平衡组递归匹配

  没细致看

来源更加详细 https://deerchao.net/tutorials/regex/regex.htm

  

时间: 2024-10-25 16:04:55

正则表达式随学记录的相关文章

正则表达式查找未记录的异常

在旧代码中,有一些地方只是写了catch{} ,但没有把异常信息记录下来,导致了分析查找问题的原因过久,但手动去查找哪儿没有捕获异常,所需要花费的时间又太长,以前有写过一次,但后来丢了,现在又要用到,先蹩脚地记录下来,给自己用的 情景一:catch (Exception ex){ }=>catch (Exception ex){TxtLog.WriteException(string.Format("任务处理错误,错误信息:{0}", ex.Message), ex);}查找内容

python下正则表达式的随笔记录

使用了下正则的表达式: 目的:取出字符串中{}中的内容 最后使用的正则表达式为 {(.*?)} 先看   .*?  : 首先  .  是用来匹配字符串,但是只能匹配一次. 所以加上  *  ,可以让 . 进行匹配多次,但是这样会匹配直到查找到最后一个}后才结束, 继续加上?,表示非贪婪匹配,就是只要 .* 匹配到}后就停止.然后继续匹配下一个. 再来看  (.*?), ()的意思是进行分组操作,默认为捕获,即被分组的内容可以被单独取出,默认每个分组有个索引,从 1 开始,按照"("的顺

正则表达式入门以及记录

在这里会跟大家介绍一下什么是正则表达式.正则表达式的一些简单使用以及在工作中常用的一些正则表达式,包括自己在工作上所使用到的正则,以备不时之需. 一 正则表达式的介绍 RegExp是正则表达式的缩写,当检索某个文本时,可以使用一种模式来描述要检索的内容.RegExp就是这种模式 简单的模式可以匹配一个字符.复杂的模式包括了更多的字符,并可用解析.格式检查.替换等.可以规定字符串中的检索位置,以及要检索的字符类型等等. 假设我有一个字符串var str = "test1213298adsadsad

Python重学记录1

写下这个标题觉得可笑,其实本人2014年就自学过一次python,当时看的是中谷教育的milo老师的视频,也跟着写了一些代码,只是因为当时工作上用不到也就淡忘了.不过说实话当时的水平也很低下,本来也没学到个什么.当时看过的书有<和孩子一起学编程><可爱的python>等 现在由于要学机器学习,重拾python,时过境迁,当时python还是很小众的一门语言,网上的资料也较少,那时候还为到底学2.x还是3.x纠结了半天,在当时的环境下虽然3.x刚出来没多久,但似乎业界用2.x还是主流

Python重学记录2

这几天学的不多,只是看了一下相关的视频.最近看的部分比较难,装饰器没有搞懂,__slots__和property也不太明白(这两个知识点是在公交车上看的视频,因为1.5倍速度放的视频,看得快,不太明白)所以需要进一步巩固.待复习巩固了把相关的学习小结补充上来. 今晚还去健身房锻炼了,特别累,真是在工作的同时要兼顾身体呢,但是锻炼了就没法看书学习了,业余时间就那么多,真是很难平衡啊,羡慕那些年轻人,有那么多时间精力去做事,如果我从20出头就开始天天学习,并坚持一个方向就好了,现在后悔还来不来得及呢

vue.js 精学记录

v-bind:class使用的方式: 1.对象与法::class="{'active':isActive}" 此时当isActive为true时,会拥有active 2.数组语法:需要应用多个class时,可以使用数组语法. :class = " [activeCls,errorCls ] ", var app = new Vue({ el:"#app", data:{ activeCls:'active', errorCls:'error' }

正则表达式从入门到以为精通再到每次使用查一遍

正则表达式(Regular Expression, 简称RegEx)是一些用来匹配和处理文本的字符串,它是用正则表达式语言创建的,这种语言的用途主要是为了检索和替换某些文本. 本文只是<正则表达式必知必会>和传说中的三十分钟学会正则表达式的一个小总结,因此,不打算从头开始介绍正则表达式,只记录一些知识点. 1. 一些元字符 元字符 意义 . 除了换行符之外的所有字符.当要表达.本身意思的时候,要使用转义符. \d 任何一个数字字符(等价于[0-9]) \D 任何一个非数字字符(等价于[^0-9

(一)一起学 APUE 之 文件 IO

. . . . . 最近在学习 APUE,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习APUE的童鞋们提供一份参考. 本系列博文均根据学习<UNIX环境高级编程>一书总结而来,如有错误请多多指教. APUE主要讨论了三部分内容:文件IO.并发.进程间通信. 文件IO: 标准IO:优点是可移植性高,缺点是性能比系统 IO 差,且功能没有系统 IO 丰富. 系统IO:因为是内核直接提供的系统调用函数,所以性能比标准 IO 高,但是可移植性比标准 IO 差. 并发:

python学完了,在这要总结一下

退学了24天了 ,python也学了24天.学习python对我来说并不是很简单,我先在学习css,要结合python来学习.python是很强大语言,它具有简洁的与语法.丰富的扩展模块,使用它可以节约成本. 这是python的局域网  # -*- coding:utf-8 -*- import threadingimport socketclass ListenThread(threading.Thread):    def __init__(self,server):        prin