正则表达式

全面剖析C#正则表达式

白昼怎懂夜的黑 提交于 2020-02-29 17:05:51
到目前为止,许多的编程语言和工具都包含对正则表达式的支持,当然.NET也不例外,.NET基础类库中包含有一个名称空间和一系列可以充分发挥规则表达式威力的类。 正则表达式的知识可能是不少编程人员最烦恼的事儿了。如果你还没有规则表达式方面的知识的话,建议从正则表达式的基础知识入手。前参见 正则表达式语法 。 下面就来研究C#中的正则表达式,C#中的正则表达式包含在.NET基础雷库的一个名称空间下,这个名称空间就是System.Text.RegularExpressions。该名称空间包括8个类,1个枚举,1个委托。他们分别是: Capture: 包含一次匹配的结果; CaptureCollection: Capture的序列; Group: 一次组记录的结果,由Capture继承而来; GroupCollection:表示捕获组的集合 Match: 一次表达式的匹配结果,由Group继承而来; MatchCollection: Match的一个序列; MatchEvaluator: 执行替换操作时使用的委托; Regex:编译后的表达式的实例。 RegexCompilationInfo:提供编译器用于将正则表达式编译为独立程序集的信息 RegexOptions 提供用于设置正则表达式的枚举值 Regex类中还包含一些静态的方法: Escape: 对字符串中的regex中的转义符进行转义

Regex C++ : 正则表达式(2).

旧时模样 提交于 2020-02-29 16:46:49
既然有了std::basic_regex存储我们的正则表达式了,那我们怎么匹配到的字符串呢? 重点强调 : 无论是std::regex_match还是std::regex_search都不能接受一个右值版本的std::basic_string!!!!! 下面我们将介绍: std::regex_search :检验是否部分字符串匹配给定的正则表达式. std::regex_match :检验是否整个字符串匹配给定的正则表达式. std::regex_search //first: 一个指向被匹配字符串开始位置的迭代器. //last: -个指向被匹配字符串结束位置的迭代器. //m: 存放匹配的结果. //e: 存放正则表达式. //flags: 指出使用哪种正则表达式的语法. template< class BidirIt, class Alloc, class CharT, class Traits > bool regex_search( BidirIt first, BidirIt last, std::match_results<BidirIt,Alloc>& m, const std::basic_regex<CharT,Traits>& e, std::regex_constants::match_flag_type flags = std::regex

巧用正则表达式,完成接口参数替换

僤鯓⒐⒋嵵緔 提交于 2020-02-29 15:43:17
最近给Python11期的小朋友们上课,遇到了一个参数替换的问题,首先描述下场景: 需要参数化的数据如下所示: 这个时候如果利用单纯的if判断和字符串的find和replace方法,做起来是非常不明智的!代码量也非常多,也非常容易的混淆! 这个时候,如果引入正则表达式,就可以非常轻松的解决这个问题!! 昂~~那么利用场景的话,就不一一描述了,我们自动化课堂上见!先分步骤分模块了解下正则表达式这个新鲜玩意! 正则是什么 用一句通俗易懂的话来说:符合一定规则的字符来匹配我们自己想要的内容! 如何学习正则 python有一个专门的正则模块re,终于如何使用这些,我当然不会说😎 ~网络上资源很多,but,给大家安利下我们小简老师的博客,有详细的讲解这个正则: -简佬博客地址,请戳我!! 不过这个博客未完待续,等着小简老师更新吧! 我们实用的场景步骤 1:准备一个get_data模块,里面有个GetData类,代码如下,存储我们各类想要的数据属性值: class GetData: admin_tel=‘18688773467’ loan_member_id=‘23357’ normal_tel=‘18688773468’ memberID=‘23456’ loanId=‘12232’ 2:要替换的参数,我们先举个例子,如下所示: {“mobilephone”:"${admin_tel}",

小心别落入正则回溯陷阱

99封情书 提交于 2020-02-29 14:32:50
不知才哪儿看来的: 如果你有一个问题,你想到可以用正则来解决,那么你有两个问题了。 回溯 对于正则而言,回溯并不是必需的,这跟具体的正则引擎有关。简单地说,正则引擎分为NFA和DFA。这东西难懂且无聊,我就挑重点说。DFA(确定型有穷自动机),从匹配文本入手,从左到右,每个字符不会匹配两次,它的时间复杂度是多项式的,所以通常情况下,它的速度更快,但支持的特性很少,不支持捕获组、各种引用等等;而NFA(非确定型有穷自动机)则是从正则表达式入手,不断读入字符,尝试是否匹配当前正则,不匹配则吐出字符重新尝试,通常它的速度比较慢,最优时间复杂度为多项式的,最差情况为指数级的。但NFA支持更多的特性,因而绝大多数编程场景下(包括js),我们面对的是NFA。 NFA匹配的过程就是吃入字符,尝试匹配,如果通过,再吃入尝试;如果不通过,就吐出,回到上一个状态,因为同一个字符串在正则中可能存在一种状态不同转化路径,这时正则引擎换一个转化状态进行尝试,如果通过,继续吃入字符,否则继续吐出字符,回到再上一个状态。这种尝试不成功就返回上一状态的过程,我们称为回溯。正则匹配的性能好坏,就看回溯的情况,回溯越多,性能越差。 为了说清楚这个问题,我们做一个实验,用 a(acd|bsc|bcd) 这个正则来对“abcd”这个字符串进行匹配。 截图上方是正则表达式,右侧是要匹配的文本,左侧是匹配的过程。 可以看到

Python下的正则表达式原理和优化笔记

老子叫甜甜 提交于 2020-02-29 14:32:09
最近的时间内对正则表达式进行了一点点学习。所选教材是《mastering regular expressions》,也就是所谓的《精通正则表达式》。读过一遍后,顿感正则表达式的强大和精湛之处。其中前三章是对正则表达式的基本规则的介绍和铺垫。七章以后是对在具体语言下的应用。而核心的部分则是四五六这三章节。 其中第四章是讲了整个正则表达式的精华,即传统引擎NFA的回溯思想。第五章是一些例子下对回溯思想的理解。第六章则是对效率上的研究。根源也是在回溯思想上的引申和研究。 这篇文章是我结合python官方re模块的文档以及这本书做一个相应的总结。 其中官方的文档: http://docs.python.org/3.3/library/re.html 由于我都是在python上联系和使用的,所以后面的问题基本都是在python上提出来的,所以这本书中的其它正则流派我均不涉及。依书中,python和perl风格差不多,属于传统NFA引擎,也就是以“表达式主导“,采用回溯机制,匹配到即停止( 顺序敏感 ,不同于POSIX NFA等采用匹配最左最长的结果)。 对于回溯部分,以及谈及匹配的时候,将引擎的位置总是放在字符和字符之间,而不是字符本身。比如^对应的是第一个字符之前的那个”空白“位置。 基础规则的介绍 python中的转义符号 干扰 python中,命令行和脚本等,里面都会对转义符号做处理

剑指Offer-正则表达式的匹配

为君一笑 提交于 2020-02-29 14:10:01
请实现一个函数用来匹配包含’. ‘和’ ‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’ '表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab ac a"匹配,但与"aa.a"和"ab*a"均不匹配。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zheng-ze-biao-da-shi-pi-pei-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 动态规划: 1、首先写出dp矩阵,定义dp矩阵中元素的意义,最好能够画图说明 2、列举矩阵中哥哥元素之间的关系,即状态转移方程,一般为dp[i][j]与dp[i-1][j],dp[i][j-1],dp[i-1][j-1]之间的关系。 3、定义矩阵的初始值。 public boolean isMatch ( String s , String p ) { if ( s == null || p == null ) return false ; int sLen = s . length ( ) ; int pLen = p . length ( ) ; //dp[i][j]表示s中前i个字符[0,i-1]与p中的前j个字符[0,j-1]能否匹配

Python——2020爬取猫眼电影Top100(一系列分析和小白版正则小技巧)

萝らか妹 提交于 2020-02-29 14:06:13
Python——2020爬取猫眼电影Top100(详解) 小白我在学习python的过程中看见买的书和csdn上的各位大佬都爬取过猫眼电影Top100当作练习,基本都是用正则表达式进行的爬取,那么我也用正则表达式进行爬取,并说一下正则表达式在编写的时候的一些小技巧,当然更方便的爬取也可以用xpath和pyquery中的类似于css选择器的语法进行爬取更为简单。 首先用谷歌浏览器打开目标网页,F12查看各类响应进行分析,主要看请求头和响应头的内容。(上图!) 我看的是名为4的请求响应,该就是包括了网页源码的请求响应,进行分析后可以看看其响应的展示(Preview)和返回内容(Response)。从中可以或多很多信息: 在General中: 我们可以得到网页的请求URL链接,请求方式get,返回响应码(200),以及远程服务器的地址和端口,在这它增加了Reffer Policy:Referrer判别策略,那么我们就简单介绍一些这个策略,这也是我在大佬博客中看到的。。 ''' no referrer when downgrade的意思:降级时不推荐。 从一个网站链接到另外一个网站会产生新的http请求,referrer是http请求中表示来源的字段。 no-referrer-when-downgrade表示从https协议降为http协议时不发送referrer给跳转网站的服务器。

正则表达式(.*?)(.+?)惰性匹配

♀尐吖头ヾ 提交于 2020-02-29 13:51:29
看了挺多博客,终于弄懂了,现在用表格整理一下: 符号 作用 . 匹配任意除换行符“\n”外的字符 * 匹配前面的字符0次或多次 + 匹配前面的字符1次或多次 ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符 .* 匹配任意除换行符“\n”外的字符0次或多次 .+ 匹配任意除换行符“\n”外的字符1次或多次 .*? 匹配任意除换行符“\n”外的字符0次或多次,但尽可能少重复 .+? 匹配任意除换行符“\n”外的字符0次或多次,但尽可能少重复 此处?的作用就是指明一个非贪婪限定符,什么叫尽可能少重复?简单点说就是匹配最短的符合要求的表达式,下面举出例子: re.match(r'a.*b', 'aababa') # 1 re.match(r'a.*?b', 'aababa') # 2 1式没有非贪婪限定符,匹配最长表达式,结果为aabab 2式有非贪婪限定符,尽可能少重复,结果为aab和ab re.match(r'a.+?b', 'aababa') # 3 同理.+?也一样,只是不包括匹配0次的情况,所以3式结果为aab 再比如: re.match(r'hello.*?world', 'xxxhelloworldxxhelloxxworld') # 4 4式的结果显而易见:helloworld和helloxxworld 来源: https://www.cnblogs.com

如何在ABBYY FineReader中创建正则表达式

谁都会走 提交于 2020-02-29 11:04:33
ABBYY FineReader是一款OCR文字识别软件,在识别文本时,可通过创建自定义语言,识别包含很多非常用元素(如代码编号)的文本字符,今天就为大家列出了在 ABBYY FineReader 用于创建自定义语言词典的正则表达式具体方法。 若有疑问可直接访问: http://www.abbyychina.com/FRshiyongjiqiao/abbyyfr-zhengzebds.html 注: 1、要将正则表达式符号作为正常字符使用,请在符号前添加反斜线。例如,[t-v]x+ 代表tx、txx、txx 等和ux、uxx等,而\[t-v\]x+则代表[t-v]x、[t-v]xx、[t-v]xxx等。 2、要分组正则表达式元素,请使用括号。例如,(a|b)+|c代表c或任何类似abbbaaabbb、ababab的组合(任何长度非零、其中可能有按任意顺序排列的任意个数的a和b的单词),而a|b+|c则代表a、c和b、bb、bbb等。 示例: 假设识别包含三列的表格:出生日期、姓名、电子邮件地址,在这种情况下,可以创建两种新语言、数据和地址,并为它们指定以下正则表达式: 日期的正则表达式: 表示日的数字可由一位数字(1、2 等)或两位数字(02、12)组成,但不能为零(00 或 0), 日的正则表达式应显示为 :((|0)[1-9])|([1|2][0-9])|(30)|(31);

正则之基本入门

风格不统一 提交于 2020-02-29 10:48:58
以前看了许许多多的正则教程,收货并不多,往往都是蜻蜓点水,一点就过。事实上,正则用处真的超级大,比如匹配innerHTML的内容,以及表单验证,也是非他莫属。这里,我结合js,对正则进行一个简单的介绍吧。 如有纰漏欢迎指出,希望大家多多包涵。 js与正则的关系 在js中定义一个正则有两种方法,一个是实例化,一个是字面量。 分别看一下: //实例化 var re = /\w+/; //这两者等价 //字面量 var re = new RegExp('\\w+'); 如果想添加一些flags也是没有问题的。 比较常用的flag有。/i,/g,/ig,/m. /i (忽略大小写,ignore) /g (全文查找出现的所有匹配字符,global) /m (多行查找,multiLine) /ig(全文查找、忽略大小写,ignore+global) 所以, 使用flag之后可以这样写. var reg = ^\d{5,12}\i$ ;//表示忽略大小写,匹配; //或者 var reg = new RegExp(^\d{5,12}\i$); 正式入门正则 正则其实就是用来匹配字符串的。他用一个简洁表达了,完成了你需要写很多代码的事,就和md(markdown)语法是一个道理。 用的人多了,自然成标准,这也是规则吧。 正则预定字符 预定字符,就是用程序比较难表达的一些字符,比如回车键,tab键