首页 > 其他分享 >Delphi正则表达式初学入门

Delphi正则表达式初学入门

时间:2023-08-16 17:36:32浏览次数:46  
标签:字符 匹配 正则表达式 Delphi 重复 正则 初学 exp 捕获

一 前言     对于正则表达式,相信很多人都知道,但是很多人的第一感觉就是难学,因为看第一眼时,觉得完全没有规律可寻,而且全是一堆各种各样的特殊符号,完全不知所云。   其实只是对正则不了解而以,了解了你就会发现,原来就这样啊正则所用的相关字符其实不多,也不难记,更不难懂,唯一难的就是组合起来之后,可读性比较差,而且不容易理解,本文旨在让大家对正则有一个基本的了解,能看得懂简单的正则表达式,写得出简单的正则表达式,用以满足日常开发中的需求即可。   0\d{2}-\d{8}|0\d{3}-\d{7} 先来一段正则,如果你对正则不了解,是不是完全不知道这一串字符是什么意思?这不要紧文章会详细解释每个字符的含义的。       1.1 什么是正则表达式        正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。   1.2 常用的正则匹配工具        在线匹配工具:     1 http://www.regexpal.com/         2 http://rubular.com/        正则匹配软件         McTracer         用过几个之后还是觉得这个是最好用的,支持将正则导成对应的语言如java C# js等还帮你转义了,Copy直接用就行了很方便,另外支持把正则表达式用法解释,如哪一段是捕获分组,哪段是贪婪匹配等等,总之用起来 So Happy .       二 正则字符简单介绍   2.1 元字符介绍      "^" :^会匹配行或者字符串的起始位置,有时还会匹配整个文档的起始位置。      "$"  :$会匹配行或字符串的结尾       如图            而且被匹配的字符必须是以This开头有空格也不行,必须以Regex结尾,也不能有空格与其它字符               "\b" :不会消耗任何字符只匹配一个位置,常用于匹配单词边界 如 我想从字符串中"This is Regex"匹配单独的单词 "is" 正则就要写成 "\bis\b"         \b 不会匹配is 两边的字符,但它会识别is 两边是否为单词的边界   "\d": 匹配数字,       例如要匹配一个固定格式的电话号码以0开头前4位后7位,如0737-5686123  正则:^0\d\d\d-\d\d\d\d\d\d\d$ 这里只是为了介绍"\d"字符,实际上有更好的写法会在     下面介绍。   "\w":匹配字母,数字,下划线.       例如我要匹配"a2345BCD__TTz" 正则:"\w+"  这里的"+"字符为一个量词指重复的次数,稍后会详细介绍。   "\s":匹配空格       例如字符 "a b c" 正则:"\w\s\w\s\w"  一个字符后跟一个空格,如有字符间有多个空格直接把"\s" 写成 "\s+" 让空格重复     ".":匹配除了换行符以外的任何字符       这个算是"\w"的加强版了"\w"不能匹配 空格 如果把字符串加上空格用"\w"就受限了,看下用 "."是如何匹配字符"a23 4 5 B C D__TTz"  正则:".+"     "[abc]": 字符组  匹配包含括号内元素的字符           这个比较简单了只匹配括号内存在的字符,还可以写成[a-z]匹配a至z的所以字母就等于可以用来控制只能输入英文了,       2.2 几种反义     写法很简单改成大写就行了,意思与原来的相反,这里就不举例子了      "\W"   匹配任意不是字母,数字,下划线 的字符      "\S"   匹配任意不是空白符的字符    "\D"  匹配任意非数字的字符      "\B"  匹配不是单词开头或结束的位置      "[^abc]"  匹配除了abc以外的任意字符       2.3  量词     先解释关于量词所涉及到的重要的三个概念       贪婪(贪心) 如"*"字符 贪婪量词会首先匹配整个字符串,尝试匹配时,它会选定尽可能多的内容,如果 失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。相比下面两种贪婪量词对资源的消耗是最大的,      懒惰(勉强) 如 "?"  懒惰量词使用另一种方式匹配,它从目标的起始位置开始尝试匹配,每次检查一个字符,并寻找它要匹配的内容,如此循环直到字符结尾处。      占有  如"+" 占有量词会覆盖事个目标字符串,然后尝试寻找匹配内容 ,但它只尝试一次,不会回溯,就好比先抓一把石头,然后从石头中挑出黄金        "*"(贪婪)   重复零次或更多        例如"aaaaaaaa" 匹配字符串中所有的a  正则: "a*"   会出到所有的字符"a"        "+"(懒惰)   重复一次或更多次          例如"aaaaaaaa" 匹配字符串中所有的a  正则: "a+"  会取到字符中所有的a字符,  "a+"与"a*"不同在于"+"至少是一次而"*" 可以是0次,          稍后会与"?"字符结合来体现这种区别        "?"(占有)   重复零次或一次          例如"aaaaaaaa" 匹配字符串中的a 正则 : "a?" 只会匹配一次,也就是结果只是单个字符a      "{n}"  重复n次          例如从"aaaaaaaa" 匹配字符串的a 并重复3次 正则:  "a{3}"  结果就是取到3个a字符  "aaa";      "{n,m}"  重复n到m次          例如正则 "a{3,4}" 将a重复匹配3次或者4次 所以供匹配的字符可以是三个"aaa"也可以是四个"aaaa" 正则都可以匹配到        "{n,}"  重复n次或更多次         与{n,m}不同之处就在于匹配的次数将没有上限,但至少要重复n次 如 正则"a{3,}" a至少要重复3次   把量词了解了之后之前匹配电话号码的正则现在就可以改得简单点了^0\d\d\d-\d\d\d\d\d\d\d$ 可以改为"^0\d+-\d{7}$"。   这样写还不够完美如果因为前面的区号没有做限定,以至于可以输入很多们,而通常只能是3位或者4位,   现在再改一下 "^0\d{2,3}-\d{7}"如此一来区号部分就可以匹配3位或者4位的了   2.4 懒惰限定符     "*?"   重复任意次,但尽可能少重复         如 "acbacb"  正则  "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就是"acb"     "+?"  重复1次或更多次,但尽可能少重复        与上面一样,只是至少要重复1次     "??"  重复0次或1次,但尽可能少重复         如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"     "{n,m}?"  重复n到m次,但尽可能少重复             如 "aaaaaaaa"  正则 "a{0,m}" 因为最少是0次所以取到结果为空     "{n,}?"    重复n次以上,但尽可能少重复             如 "aaaaaaa"  正则 "a{1,}" 最少是1次所以取到结果为 "a"       三  正则进阶        3.1 捕获分组     先了解在正则中捕获分组的概念,其实就是一个括号内的内容 如 "(\d)\d" 而"(\d)" 这就是一个捕获分组,可以对捕获分组进行 后向引用 (如果后而有相同的内容则可以直接引用前面定义的捕获组,以简化表达式) 如(\d)\d\1 这里的"\1"就是对"(\d)"的后向引用   那捕获分组有什么用呢看个例子就知道了   如  "zery zery" 正则 \b(\w+)\b\s\1\b 所以这里的"\1"所捕获到的字符也是 与(\w+)一样的"zery",为了让组名更有意义,组名是可以自定义名字的   "\b(?\w+)\b\s\k\b" 用"?"就可以自定义组名了而要后向引用组时要记得写成 "\k";自定义组名后,捕获组中匹配到的值就会保存在定义的组名里   下面列出捕获分组常有的用法   "(exp)"    匹配exp,并捕获文本到自动命名的组里   "(?exp)"   匹配exp,并捕获文本到名称为name的组里   "(?:exp)"  匹配exp,不捕获匹配的文本,也不给此分组分配组号   以下为零宽断言   "(?=exp)"  匹配exp前面的位置     如 "How are you doing" 正则"(?.+(?=ing))" 这里取ing前所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为"How are you do";   "(?<=exp)"  匹配exp后面的位置     如 "How are you doing" 正则"(?(?<=How).+)" 这里取"How"之后所有的字符,并定义了一个捕获分组名字为 "txt" 而"txt"这个组里的值为" are you doing";   "(?!exp)"  匹配后面跟的不是exp的位置     如 "123abc" 正则 "\d{3}(?!\d)"匹配3位数字后非数字的结果   "(?     如 "abc123 " 正则 "(?

标签:字符,匹配,正则表达式,Delphi,重复,正则,初学,exp,捕获
From: https://www.cnblogs.com/lucken2000/p/17635711.html

相关文章

  • C#实现用正则表达式替换JSON中大字段的内容
    ///<summary>///过长的数据在日志中不显示///</summary>///<paramname="orilog">原请求</param>///<paramname="ignore">需要过滤的参数</param>privatestringRemoveIgnor......
  • 正则表达式
    正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种我们所需要的子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。  JavaScript和Java使用正则表达式的区别JavaScript使用正则表达式创建正则对象RegExp对......
  • delphi 自带 的JOSN 序列化 三
    TConverterEx<T:class>=class(TJsonConverter)publicfunctionCanConvert(ATypeInf:PTypeInfo):Boolean;override;functionReadJson(constAReader:TJsonReader;ATypeInf:PTypeInfo;constAExistingValue:TValue;constASerializer:......
  • IT初学者在哪里可以发现一些好的基础视频呢?
     经常碰到一些粉丝说参加了某某培训机构的培训课程,什么都没写会,还白白打上了一两万块。想到这里挺为他们心痛的,我认为你如果是初学者,必然是没什么基础的;为了薪资高而学习IT行业,而没有浓厚的兴趣,很难在参加培训的脱产班3个月的时间内学习比较深入的东西。如果你是IT兴趣爱好者,而且......
  • 正则表达式
    转载自:https://zhuanlan.zhihu.com/p/33683962一、校验数字的表达式数字:^[0-9]*$n位的数字:^d{n}$至少n位的数字:^d{n,}$m-n位的数字:^d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(-......
  • Linux之shell脚本的正则表达式
    目录一、正则表达式1.1元字符1.2表示次数一、正则表达式通配符功能是用来处理文件名,而正则表达式是处理文本内容中字符[localhost~]#man7regex#可以使用man手册帮助1.1元字符. 匹配任意单个字符,可以是一个汉字[] 匹配指定范围内的任意单个字符,示例:[zhou]......
  • 深入理解JavaScript正则表达式:释放其强大力量
    深入理解JavaScript正则表达式:释放其强大力量正则表达式是一种强大的工具,用于在字符串中搜索、匹配和替换特定的模式。在JavaScript中,正则表达式是一种内置的功能,可以帮助开发人员处理各种字符串操作。本文将深入探讨JavaScript正则表达式的原理、语法和应用场景,帮助读者充分理解......
  • 初学者思维 - 找到解决问题的新方法
    聪明的人,是能够同时保有两种截然不同的观念,还能正确行事,这是一流智慧的标志。在一些特定场景下,我们需要招聘有经验的人,但在另一些场景下,我们需要招聘新人。这很正常,软件领域没有银弹,适合的才是最好的。什么是初学者思维?初学者思维,也就叫初学者心态。指的是不要无端的去猜测,不要期望......
  • Delphi 2010 新增功能之: IOUtils 单元(6): TPath(结构体) 的方法与属性
    以后路径相关的处理,用IOUtils.TPath就很方便了.//较常用的方法:TPath.GetTempPath;         {获取临时文件夹路径}TPath.GetTempFileName;       {获取一个临时文件名}TPath.GetPathRoot();        {提取盘符,如:c:......
  • 正则表达式学习笔记
    .:任意一个字符\d:代表一个数字,等价于[0-9]\D:代表一个非数字,等价于[^\d]或者[^0-9]\s:代表一个空白字符,诸如Space,\n,\r,Tab\S:代表一个非空白字符\w:代表一个单词字符,诸如a,9,_,蛙\W:代表一个非单词字符*:量词,左侧字符串出现任意次(包括\(0\)次)?:量词,左侧字符出现\(\le1\)次+:......