正则表达式

正则表达式今天看到了正则表达式,就再来重新巩固一遍啦~~~因为一些东西我都知道啦,所以就写了一个代码,将所发生的情况都试一试,还是直接上手知识来的更快呀一些功能必要说明都在注释里测试代码1import

大家好,又见面了,我是你们的朋友全栈君。

今天看到了正则表达式,就再来重新巩固一遍啦~~~

因为一些东西我都知道啦,所以就写了一个代码,将所发生的情况都试一试,还是直接上手知识来的更快呀

一些功能必要说明都在注释里

测试代码

 1 import re
 2 
 3 text = 'Hi, I am Shirley Hilton. I am his wife.'
 4 text2 = 'site sea sue sweet see case sse ssee loses'
 5 text3 = '312347829412231877187874328709'
 6 text4 = 'aj科 技eu_^%#@^(*&^^-=wio238 jdhfaD按数据库we97r389'
 7 text5 = '(021)88776543 010-55667890 02584453362 0571 66345673 32473 23545346346547900'
 8 
 9 print(re.findall(r"\bhi", text))   # \b是表示单词的开头或者结尾,空格、标点、换行都是单词的分隔。
10 print(re.findall("i.", text))      # .代表匹配任意一个字符
11 print(re.findall(".", text))
12 print(re.findall(r"\S", text))     # 不是空白符的任意一个字符
13 print(re.findall(r"i\S", text))
14 print(re.findall("I.*e", text))     # *代表前面前面的字符可以重复任意多次(包括0)仅代表数量
15 print(re.findall("I.*?e", text))    # ?懒惰匹配,与*不同,?匹配到最短的就停止
16 print(re.findall(r"\bs\S*?e\b", text2))    # 如果用 r"\bs.*?e\b"  会混进来一个带空格的两个单词,就不是要查询的一个单词了。
17 print(re.findall(r"\bs.*?e\b", text2))
18 print(re.findall("1[0-9]{10}", text3))
19 print(re.findall(r"\bc.*l", text2))
20 print(re.findall(r"\d+", text3))
21 print(re.findall("[0-9]*", text3))
22 print(re.findall("[0-9]+", text3))  # +与* 的区别就在于 +是会至少匹配1个, *可以是0
23 print(re.findall(r"\w", text4))   # 匹配字母、数字、下划线、汉字
24 print(re.findall(r"\s", text4))    # 匹配任意的空白符
25 print(re.findall(r"\(0\d{2,3}\)\d{7,8}|0\d{2,3}[ -]?\d{7,8}|\d+", text5))
26 #  首先看第一个|之前的 \(0\d{2,3}\)是匹配(021) \d{7,8}是后面的88776543
27 #  再看下一个0\d{2,3}[ -]?\d{7,8} 匹配0开头的0xx或者0xxx  然后后面紧跟着空格或者- 这两个符号可以匹配(可有可无?)然后再匹配剩下的后面的数字\d{7,8}
28 #  最后面的\d+ 就是一个收尾的,前面的匹配不成功的就在这里等着了, 根据管道符从左到右依次匹配,所以\d{7,8}放最后啦

执行结果

['hi']
['i,', 'ir', 'il', 'is', 'if']
['H', 'i', ',', ' ', 'I', ' ', 'a', 'm', ' ', 'S', 'h', 'i', 'r', 'l', 'e', 'y', ' ', 'H', 'i', 'l', 't', 'o', 'n', '.', ' ', 'I', ' ', 'a', 'm', ' ', 'h', 'i', 's', ' ', 'w', 'i', 'f', 'e', '.']
['H', 'i', ',', 'I', 'a', 'm', 'S', 'h', 'i', 'r', 'l', 'e', 'y', 'H', 'i', 'l', 't', 'o', 'n', '.', 'I', 'a', 'm', 'h', 'i', 's', 'w', 'i', 'f', 'e', '.']
['i,', 'ir', 'il', 'is', 'if']
['I am Shirley Hilton. I am his wife']
['I am Shirle', 'I am his wife']
['site', 'sue', 'see', 'sse', 'ssee']
['site', 'sea sue', 'sweet see', 'sse', 'ssee']
['12347829412', '18771878743']
['case sse ssee l']
['312347829412231877187874328709']
['312347829412231877187874328709', '']
['312347829412231877187874328709']
['a', 'j', '', '', 'e', 'u', '_', 'w', 'i', 'o', '2', '3', '8', 'j', 'd', 'h', 'f', 'a', 'D', '', '', '', '', 'w', 'e', '9', '7', 'r', '3', '8', '9']
[' ', ' ']
['(021)88776543', '010-55667890', '02584453362', '0571 66345673', '32473', '23545346346547900']

其他一些说明

^ – 匹配字符串的开始

$ – 匹配字符串的结束

\S其实就是\s的反义,任意不是空白符的字符。同理,还有:

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

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

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

 ? – 重复零次或一次

{n,} – 重复n次或更多次

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

[a]的反义是[^a],表示除a以外的任意字符。[^abcd]就是除abcd以外的任意字符。

 

接下来的内容是通关课程中的没见过的知识点 https://www.w3cschool.cn/codecamp/list?pename=regular_expressions_camp

正向和负向Lookahead

Lookahead是一种模式,可以让JavaScript在字符串中预先检查,以便进一步检查模式。当你想在同一个字符串中搜索多个模式时,这可能很有用。

lookaheads有两种:positive lookahead正向预查和negative lookahead负向预查。

positive lookahead将预查确保搜索模式中的元素在那里,但实际上不会匹配它。正向预查是使用(?=...),其中...是不匹配的必需部分。

另一方面,negative lookahead将会预查搜索模式中的元素不存在。负向预查是使用(?!...),其中...是你不想在那里出现的模式。如果不存在负向预查的部分,则返回该模式的其余部分。

1 var quit = "qu";
2 var noquit = "qt";
3 var quRegex= /q(?=u)/;
4 var qRegex = /q(?!u)/;
5 quit.match(quRegex); // 返回 ["q"]
6 noquit.match(qRegex); // 返回 ["q"]

lookaheads的更实际用途是预查一个字符串中的两个或多个模式。以下是一个简单的密码检查器,预查3到6个字符和至少一个数字:

1 var password = "abc123";
2 var checkPass = /(?=\w{3,6})(?=\D*\d)/;
3 checkPass.test(password); // 返回 true

pwRegex中使用lookaheads来匹配长度大于5个字符并具有两个连续数字的密码。

var pwRegex = /(?=[a-z]{3,})(?=\D*\d{2,})/;

使用捕获组复用模式

你把会重复的模式的正则表达式放在括号之间。

要指定重复字符串的出现位置,你可以使用反斜杠(\),然后使用数字。该数字从1开始,并随着你使用的每个附加捕获组而增加。一个例子是\1来匹配第一个组。

\2就是匹配第二个括号里的捕获组

1 var repeatStr = "regex regex"; 2 var repeatRegex = /(\w+)\s\1/; 3 repeatRegex.test(repeatStr); // 返回 true
4 repeatStr.match(repeatRegex); // 返回 ["regex regex", "regex"]

reRexx中使用capture groups捕获组来匹配字符串中出现三次的数字,每个数字由空格分隔

1 var reRegex = /(\d+)\s(\d+)\1\s\2/;
2 var reRegex = /(\d+)(\d+)\s\1\2\s/;

以上两种方法,这里真的试了很多次

一共有两个(\d+),两个括号两个匹配模式,总之就是要匹配数字,然后是空格符\s,然后又是数字,这个我好晕,这两个结果还都是正确的。

使用捕获组进行搜索和替换

1 "Code Camp".replace(/(\w+)\s(\w+)/, '$2 $1'); 2 //返回"Camp Code"

从开头和结尾删除空格

1  var hello = "   Hello, World!  ";
2  var wsRegex = /\w.*?!/ig;
3  var result = hello.match(wsRegex);  //得到Hello, World

参考链接
https://www.jianshu.com/p/756367c6c0eb

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/155476.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何提高OKCC呼叫中心坐席利用率

    如何提高OKCC呼叫中心坐席利用率说到底,呼叫中心是经营人的一个行业,是劳动密集型的一个典型场景。但凡是劳动密集型行业,都有一个典型特点,就是毛利偏低,效率提高或降低5到10个点,往往就是赚钱、白干甚至亏本的分界线。也正是因为如此,不管是呼入客服型,还是外呼电销型,坐席利用率,都是衡量呼叫中心管理效率的核心指标之一。坐席利用率,是坐席投入工作的有效时长占上班总时长的比例。投入工作的时间,主要包括接打电话的时间以及用于记录电话交流信息的话后处理时间,这部分时间再加上用餐、休息、培训及会议、总结交流等时间,即是坐席一天的工作总时间。显

    2022年7月12日
    11
  • 利用ItextPdf、core-renderer-R8 来生成PDF「建议收藏」

    利用ItextPdf、core-renderer-R8 来生成PDF

    2022年1月29日
    42
  • Pytest(13)命令行参数–tb的使用

    Pytest(13)命令行参数–tb的使用前言pytest使用命令行执行用例的时候,有些用例执行失败的时候,屏幕上会出现一大堆的报错内容,不方便快速查看是哪些用例失败。–tb=style参数可以设置报错的时候回溯打印内容,可以设置参

    2022年7月31日
    1
  • 服务端稳定性测试_web端性能测试怎么做

    服务端稳定性测试_web端性能测试怎么做1概述1.1背景系统的稳定性是系统长期稳定运行能力,需要时间累积才能度量。平台的某些问题需要达到一定时间、一定的使用量后才会暴露出来。如内存泄漏,系统运行过程中发现部分服务的部分接口会发生服务不可达的情况。从而团队提出对平台进行稳定性分析,通过给系统施加一定业务压力大情况下,使系统持续运行一段时间,以此来检测系统是否稳定运行(下统称稳定性测试或测试)。1.2服务说明平台运行的服务包括系统服务和业务服务,系统服务包括Consul、Redis、Cap、RabbitMQ、Exceptionless

    2022年9月5日
    2
  • ElasticSearch安装&安装成windows服务

    ElasticSearch安装&安装成windows服务ElasticSearch安装&安装成windows服务

    2022年6月17日
    33
  • zen cart template zencart模板修改[通俗易懂]

    zen cart template zencart模板修改[通俗易懂]encarttemplatezencart模板修改byZENCART模板 | postacomment下面简单的介绍下zencart网站模板的修改。修改较多的地方:(常用代码)一:头部文件为(例子):D:AppServwwwzencart12698includestemplatestheme3common–tpl_header.php1.

    2022年7月27日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号