正则表达式通俗?正则表达式常用
大家好,正则表达式通俗相信很多的网友都不是很明白,包括正则表达式常用也是一样,不过没有关系,接下来就来为大家分享关于正则表达式通俗和正则表达式常用的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
grep 命令与正则表达的协同使用
UpDate 2018-10-22
Author unnam3d
Mail indv.zhang@foxmail.com
Tip Please feel free to contact me via mail above for any confusion or suggestions
grep(Global Research)亦即根据某一个模式(过滤规则)去全局性的搜索文本,并将符合模式的文本行显示出来。grep其本身的意义是做部分匹配,也就是说,当你使用grep进行搜索的时候,只要某一行的内容里部分匹配,grep就会将结果显示出来。而这里的模式(Pattern)是指,文本字符和正则表达式的元字符组合而成的匹配条件。简而言之,grep就是使用基本正则表达式定义的模式来过滤文本的命令。
notice:grep默认工作在贪婪模式下,也就是在匹配的过程中,会尽可能长的匹配,能匹配到哪就匹配到哪。
usage: grep [options] PATTERN [FILE...]
正则表达式分为基本正则表达式(Basic REGEXP)与扩展正则表达式(Extended REGEXP)。
无论是哪一种,正则表达式都含义几个特性:
正则表达式里都有一些元字符,这些元字符不表示其本身的意义,而是在正则表达式中有其特定的意义。我在 bash特性简单梳理一文中提及过文件名通配(globbing)。
在文件名通配中,这些元字符的特定意义如下:
而在正则表达式中,元字符的特定意义为:
除了这些特定的元字符的意义外,正如文件通配符中所描述的字符集合,正则表达式同样支持字符集合:
位置锚定,就是在进行搜索的时候,所搜索的字符必须出现在特定的位置。
分组的意义,通俗的来讲,就是将一捆字符作为一个整体来看待,用 \(\)来表示。
例如: \(ab\)*将ab作为一个整体,星号修饰的ab这一个整体。而ab*仅仅修饰b一个字符
$ grep'\(ab\)*' test.txt
上面这个命令就表示在文件 test.txt中匹配ab这一整体,它可以匹配到ab, abab, ababab这样。
后向引用
与分组搭配使用的还有后向引用。
扩展正则表达式与正则表达式在很多地方的意义都是相同的。例如:
NOTICE:
除了与正则表达式相同意义的地方,扩展表达式也有其独特的地方:
详解正则表达式与 NFA 的转换
NFA是 Non-deterministic Finite state Automata的缩写。所以先理解 NFA之前我们先理解 DFA,也就是 deterministic Finite state Automata。
通俗的说, DFA就是一系列状态的合集,关键词是状态!
我们先写一个关于灯泡的 DFA:
(两个圈是终态,我们把「灯泡关闭」的状态当做终态)
简单来说,NFA就是存在着不确定状态转换的 DFA。
我们还拿灯泡的例子:
(灯泡打开的时候还有可能会坏掉)
先列出三种基本正则表达式的 NFA图:
表示 A与 B的连接,NFA图如下:
我们来画一个复杂的正则表达式与 NFA的转换
1)首先把 a看成 A,把(b|c)*看成 B就有:
2)再拆解(b|c)*
3)最后拆解 b|c
好!我们继续学习编译原理!
perl正则表达式中的模式分组疑问
这是perl里模式分组的概念,如果不是很懂,可以找下小骆驼版的看下,里面说的很清楚。
对于perl:
在正则表达式中,小括号()的作用是对字符串分组,其出现的地方一般会触发正则表达式引擎捕获匹配到的字符串,然后捕获组会的把匹配小括号中模式的字符串保存到相应的地方。第一个()内所找到的字符串保存到$1和\1变量;第n个()内所找到的字符串保存到$n和\n变量中。
$x与\x的区别是:\x反向引用的是模式匹配期间得到的结果,即只有在模式匹配期间能使用;
而$x则是模式匹配结束后对得到的捕获内容的索引,即到下次出现正确匹配前,这个变量的内容会一直存在
对于你的例子”/(.)\1/
是.匹配一个字符,然后用()括起来,是把这个匹配的字符放在捕获变量1中,这样就可以用\1或$1来引用这个匹配的字符。所以/(.)\1/就是匹配二个连续的且相同的字符,就是你说的,再重复一次的意思。
关于正则表达式通俗,正则表达式常用的介绍到此结束,希望对大家有所帮助。