什么是正则?

正则是用于匹配字符串的字符组合的模式。正则不是一门编程语言,而是编程语言中会用到的一个工具,不管什么编程语言,都会用到正则表达式。
举个栗子:
想在以下文字中匹配以keai结尾的文字

".+"表示"某" ".+keai" 成功匹配

再举个栗子:
想在以下文字中匹配以chi开头的文字

"chi.+" 成功匹配

为什么用正则?

除了正则,可以在程序中写一个解析器代替正则的工作。但是有了正则,一行代码就可以搞定~

正则核心语法

一个很好用的在线解析正则的网站
https://regexr.com/

最简单的情况:直接用文字匹配

以下情况无法匹配 因为圆葱aa是一个整体 在下面的字符串找不到匹配字符

当想要匹配圆某时 可以使用"圆."来匹配

不难判断出
1. "."的含义:匹配除断行外任意一个字符
如图 匹配了所有字符

栗子1:

栗子2:

注意:断行不可匹配!!!!如下图

一个特殊情况 当我们想要匹配3.14时 图中匹配的结果却是3.14和3-14

这是因为"."代表任意字符
那么如何才能明确匹配到3.14呢?这就需要转义符"\"
"\."代表"." 如图 即可明确匹配到3.14

2."w" 匹配阿拉伯数字,英文大小写字母和下划线(类似于用户名的格式)

3."W" 匹配被"w"排除在外的字符("w"的补集)

4."d" 匹配阿拉伯数字

注意:"\d\.\d"匹配小数

5."\D" 匹配非阿拉伯数字 包括空格("\d"的补集)

6."\s" 匹配空白字符:空格 制表符 断行等

7."\S" 匹配被"\s"排除在外的字符("\s"的补集)

8."[]"字符集合方括号中填写出现的可能性(范围) 整个括号算一个字符

举个栗子:

"-"在"[ ]"表示表示从一个字符到另一个字符
举个栗子就懂~

匹配a到z

匹配0到9

9.当需要匹配中文时 使用Unicode
Unicode是万国码,是用数字代表文字的一项标准。世界上所有可以书写,发音的语言都被Unicode所吸纳。
中文字符从0x4e00(19968)开始 0x9fa5(40869)结束
也就是说 记录在Unicode中的中文字符有20901个字~

可以查询Unicode的网站
http://graphemica.com/

10."[范围]+"重复一次或多次

注意特殊情况 (应用到前面所说 方括号代表范围)

11."[范围]*"重复零次或多次

12."[范围]?"重复零次或一次

13."{a,b}"指定重复范围(a到b次)

"b" word boundary 单词边界

想精确匹配一段字符 必须重复几次 也可在花括号中指定

想指定某字符至少重复几次 也可在花括号中指定

至少重复两次

{0,}相当于"+" {0,1}相当于"?" {1,}相当于"*"

14.分组匹配
直接举个栗子来说
我们希望 替换句子中两个姓名的位置。如何实现? 这就要用到分组匹配。

首先 使用圆括号将两个人名摘出来(也就是分组)

使用https://regexr.com/网站中的替...

"$1"代表第一组(李栓蛋) "$2"代表第二组(王花花)

这样看来 想替换两名字的位置就简单极了

so easy

一次性将两个句子都替换了

这就是分组的强大之处:可以将我们指定的组暂时缓存,用序号表示,也可以命名(JS暂时不支持命名)

15.分组匹配但不捕获
首先看几组电话号码

前4个为移动号码 第5个为联通号码 最后一个为电信号码
首先我们想要选中所有的移动号码 然后拿到它们的后四位

首先我们在乎的是前三位(一个号段) 然后是中间四位(我们并不在乎它们是什么) 最后是我们想要获取的四位(由于是我们最后想要获取的 所以我们用括号括起来 说明它是一个组)

然后通过看号段 将其它号码排除在外 也就是说 我们只匹配137138182183这四种号段的电话号码 可以使用以下写法

现在我们既匹配了所有移动号码 又获取到了他们的后四位

此时我们只用到了第2组,也就是说我们的第一组是浪费的。我们只是想用这种方式匹配它而并不想要获取。有没有这种操作呢?当然有。
(?:模式)匹配分组但不捕获

这样一来就不浪费了~

16.正向预查
首先看这坨字符

前面是货币值,后面是货币单位。
现在我们的任务是,选中所有以元结尾的数字(不包括单位)

当我们需要匹配单位时

但我们现在的任务是 只获取数字 不包括单位 此时就需要用到正向预查
(?=模式) 正向肯定预查

它的含义就是 前面是我们要匹配的东西 后面一定是等号后面的东西 但是不匹配它

(?!模式) 正向否定预查
这句的意思是 匹配所有的数字 后面不是元的

我们希望匹配100刀和100磅 但是匹配结果和我们预想不同

这就需要我们注意 当使用反向预查时 我们后面要将前面匹配的类型排除在外。

这就成功匹配了。

17.反向预查
上面我们提到正向预查 正向预查是 我们要匹配的东西的右边一定是什么
而反向预查是 我们要匹配的东西的左边一定是什么

我们的任务是 匹配所有人民币的数额

(?<=模式) 反向肯定预查

注意:JS引擎不支持反向预查 右上角切换一个更加完善的引擎即可~

与之相反的是反向否定预查

(?<!模式) 反向否定预查

我们发现 跟之前出现了同样的问题

同理前面所说 应用反向预查时要将后面匹配的类型排除在外

这样就可以匹配到非人民币的货币数额~非常强大!

正则表达式入门的更多相关文章

  1. Html5 canvas实现粒子时钟的示例代码

    这篇文章主要介绍了Html5 canvas实现粒子时钟的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. 在Xcode4中,你可以更改用于显示隐形字符的字符吗?

    我更喜欢VisualStudio显示隐形的方式……

  3. ios – 应用程序商店描述特殊字符

    是不是可以在AppStore描述中使用像星星这样的特殊字符了?我得到这个错误:描述不得包含标记语言.说明不得包含以下字符:★提前致谢:)解决方法仍然允许一些unicode字符.以下字符已经过测试并仍然有效:◆√至于现在他们工作正常,但苹果可以随时再次改变条件.

  4. ios – 将数组中的字符转换为整数

    即使我搜索了文档,我似乎无法弄清楚如何做到这一点.我试图弄清楚如何将数组中索引处的字符转换为整数.例如,假设我有一个名为“容器”的字符数组,我无法弄清楚该怎么做:谢谢您的帮助!解决方法Swift并不容易在原始和类型表示之间进行转换.这是一个在此期间应该有所帮助的扩展:这使您可以非常接近您想要的:对于遇到此问题的任何工程师,请参阅rdar://17494834

  5. ios – 创建一个包含n个空格或其他重复字符的字符串

    我想使用Swift使用n个空格进行字符串,但不使用for循环或手动如下所示:解决方法String已经有一个repeating:count:initializer就像Array(和其他采用RangeReplaceableIndexable协议的集合):所以你可以打电话:请注意,重复的参数是一个字符串,而不仅仅是一个字符,因此您可以重复整个序列:编辑:更改为Swift3语法,并删除了关于Swift1类

  6. ios – 如何使用Unicode十六进制值(UTF-16)在Swift中表达字符串

    我想在Swift中使用十六进制值编写一个Unicode字符串.我已经阅读了字符串和字符的documentation,所以我知道我可以使用特殊的Unicode字符直接在字符串如下:版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  7. iOS设备UDID是否区分大小写?

    这是关于将设备添加到供应门户以进行临时测试.客户端向我发送了一个带有大写字符的UDID,我愚蠢地添加了这些字符而没有检查.无线部署不起作用,我想知道这是否可能是原因,但我想在使用我的100个分配之一之前先检查.解决方法是的,UDID区分大小写.如果它不是数字,您可以浏览所有字符并将它们转换为小写字符.

  8. ios – 在NSString中查找俄语字符

    我必须检查Nsstring中是否存在俄语字符.我正在使用以下代码:但它总是返回FALSE.任何人都可以告诉我我的代码有什么问题吗?谢谢解决方法目前,您的条件检查字符串中不存在非俄语字符,而不是字符串中存在西里尔字符.对于完全由拉丁字母1中没有等效字符的西里尔字符组成的字符串,您的代码将返回YES.要解决此问题,请删除反转,然后反转检查,如下所示:1您忘记在列表中包含软停止,它看起来像小写字母b,但它不是相同的字符.

  9. ios – 计算Swift String的字节大小

    我正在尝试计算Swift中String的字节大小,但我不知道字符的大小是多少;一个编码的字节数是多少?假设我有一个字符串:让str=“你好,世界”我想将它发送到我的服务器,但我的服务器只接受32字节以下的字符串.我如何控制弦乐的长度?解决方法这一切都取决于字符编码,让我们假设UTF8:请注意,并非所有字符在UTF8中都具有相同的字节大小.如果您的字符串是ASCII,则可以假设每个字符有1个字节.

  10. ios – 如何找到包含给定字符的字体?

    我有一个字体,我用于我的应用程序,只使用英文字符.我使用CoreText来显示文本,我注意到只要有人输入了字体中没有包含的字符,程序就会挂起来:我有一些问题:>是否可以知道字体中是否包含某个字符?>系统是否可以找到包含未知字符的字体?相关:CheckifcertaincharacterissupportedbyUIFont解决方法1)是否可以知道字体中是否包含某个字符?

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部