当前位置: 首页 > Linux

正则表达式--正则表达式

时间:2023-04-07 00:28:55 Linux

摘要正则表达式是一门卓越的技术,也是一门伟大的科学。在这篇博客中,我将简要介绍它的历史,详细讨论它的语法,最后谈谈它在JavaScript和Linux中的应用。快速阅读步骤:定义-->PATTERN-->JavaScript中的RegExp/Linux中的grep命令佩尔|JavaScript|LinuxStory1940s:正则表达式最初的想法来自两位神经科学家:WalterPitts和McCulloch,他们开发了一个模型来以数学方式描述神经网络。1956年:一位名叫StephenKleene的数学家发表了一篇名为《神经网事件的表示法》的论文,使用称为正则集的数学符号来描述模型,并引入了正则表达式的概念。正则表达式用于描述他们所谓的“正则集代数”,因此称为“正则表达式”。1968年:C语言之父、UNIX之父KenThompson利用这个“正则表达式”的理论成果,对搜索算法进行了一些研究。他描述了一个正则表达式的编译器,所以应该算是最早的正则表达式编译器qed(后来变成了grep编辑器)。Unix使用正则表达式后,正则表达式不断发展壮大,进而大规模地应用于各个领域。根据这些领域各自的条件和需要,正则表达式发展了很多版本,出现了很多分支。我们称这些分支为“流派”。1987年:Perl语言诞生。它综合了其他语言,并以正则表达式为基础,创造了一个新的流派,即Perl流派。后来很多编程语言如:Python、Java、Ruby、.Net、PHP等在设计正则表达式支持时都参考了Perl正则表达式。定义及原理定义正则表达式是由一类特殊字符和文本字符编写的模式,其中一些并不表示其字面意义,而是用来表示控制或通配符功能。原理-正则表达式引擎RegularExpressionengine这里可以参考猪哥的这篇博客。PATTERN一个正则表达式通常称为模式,它是(二声)用来描述或匹配一系列符合一定语法规则的字符串。元字符正则表达式由两种基本字符类型组成:文字文本字符和元字符。元字符赋予正则表达式处理能力。所谓元字符,是指正则表达式中那些具有特殊含义的特殊字符,可以用来指定其前导字符(即元字符之前的字符)在目标对象中的出现方式。字符匹配。:匹配任何单个字符;[]:匹配指定范围内的任意单个字符;[^]:匹配指定范围外的任意单个字符;限制其前面字符的出现次数。*:匹配前面的字符任意次数(0次、1次或多次);.*:匹配任意长度的任意字符;?:匹配前面的字符0次或1次,即前面的字符可以有None;+:匹配前面的字符一次或多次,即前面的字符必须至少出现一次;{m}:匹配前面的字符m次;{m,n}:匹配前面的字符最少m次,最多n次;{0,n}:最多匹配n次前面的字符;{m,}:匹配前一个字符至少m次;positionanchor^:lineanchor,用于模式Leftmost;$:行尾锚点,用于模式的最右侧;^PATTERN$:使用PATTERN匹配整行;^$:匹配空行;^[[:space:]]*$:匹配空行或包含空白字符的行;词:由非特殊字符组成的连续字符或字符串称为词;\<或\b:初始锚点,用于字模式的左侧;\>或\b:词尾锚点,用在词型右侧;\:匹配一个完整的单词;分组引用():将一个或多个字符捆绑??在一起,作为一个整体对待;\1:模式从左开始,第一个左括号和匹配的右括号之间的模式匹配的字符;\2:模式从左边开始,第二个左括号和匹配的右括号之间的字符模式匹配的字符;backreference:引用前面分组括号中pattern匹配的字符;特殊元字符\b:匹配单词的边界;\d:匹配一个数字,相当于[0-9];\D:匹配一个非数字,相当于[^0-9];\n:匹配一个换行符;\r:匹配一个回车符;\s:匹配一个空白字符;\t:匹配一个制表符;\w:匹配单个单词字符,相当于[A-Za-z0-9];JavaScript中的RegExpECMAScript通过RegExp类型支持正则表达式;定义方法JavaScript有两种定义正则表达式的方式。文字形式varexpression=/pattern/flags;pattern就不细说了,说说flags标志:g:global,全局模式,会匹配所有的字符串;i:不区分大小写,忽略大小写;m:multiline,多行模式,当到达一行的末尾时,会继续搜索下一行;RegExp构造函数varexpression=newRegExp("pattern","flags");注意:传递给RegExp构造函数的两个参数是字符串;RegExp实例属性varpattern1=/\[bc\]at/i;alert(pattern1.global);alert(pattern1.ignorecase);alert(pattern1.multiline);alert(pattern1.lastIndex);alert(pattern1.source);varpattern2=newRegExp("\\[bc\\]at","i");alert(pattern1.global);alert(pattern1.ignorecase);alert(pattern1.multiline);alert(pattern1.lastIndex);alert(pattern1.source);RegExp实例方法exec()此方法采用一个字符串作为参数应用模式,并返回一个包含有关第一个匹配项的信息的数组。vartext="爸爸妈妈和宝宝";varpattern1=/妈妈(和爸爸(和宝宝)?)?/gi;varmatches=pattern1.exec(text);//["mom",undefined,undefined,index:0,input:"momanddadandbaby",groups:undefined]alert(matches.index)alert(matches.input)alert(matches[0])alert(matches[1])alert(matches[2])对于exec()方法,它一次只会返回一个匹配项,即使在模式中设置了全局标志。test()方法接受一个字符串参数,如果模式与参数匹配则返回true,否则返回false。vartext="000-00-0000";varpattern=/\d{3}-\d{2}-\d{4}/;if(pattern.test(text)){alert("模式是matched.")}RegExpConstructorPropertiesRegExp的静态属性,适用于范围内的所有正则表达式,并根据最后执行的正则表达式操作而改变。输入$_:最后一个匹配的字符串;lastMatch$&:最后一个匹配项;lastParen$+:最后匹配的捕获组;leftContext$`:输入字符串中lastMatch之前的文本;multiline$*:布尔值,表示是否所有表达式都使用多行模式;rightContext$':输入字符串中lastMatch之后的文本;vartext="这是一个短暂的夏天";varpattern=/(.)hort/g;如果(pattern.test(text)){alert(RegExp.input);//这是一个短暂的夏季警报(RegExp.leftContext);//这是一个警报(RegExp.rightContext);//夏季警报(RegExp.lastMatch);//短警报(RegExp.lastParen);//salert(RegExp.multiline);//false}Linux中的grep命令全局搜索正则表达式并打印出行。grep[OPTIONS][-ePATTERN|-fFILE][FILE...]OPTIONS:--color=auto-i:忽略大小写;-o:只显示匹配的字符串本身;-v:显示与模式不匹配的行;-E:支持使用扩展的正则表达式元字符;-q:静默模式;-A#:在#行之后;-B#:#行前后;-C#:#行前后;麻哥大师红书猪哥