zoukankan      html  css  js  c++  java
  • 正则表达式基础入门

    什么是正则表达式

    正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为 regexregexpRE),计算机科学的一个概念。

    正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

    许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由UNIX中的工具软件(例如sedgrep)普及开的。正则表达式通常缩写成“regex”,单数有regexpregex,复数有regexpsregexesregexen
    简单的说形式和功能上正则表达式和通配符很像,不过它们之间又有很大差别,特别在于一些特殊的匹配字符的含义上,希望初学者注意不要将两者弄混淆。

    附:通配符

    通配符与正则表达式很容易混淆,首先要明白二者是不同的,个人感觉通配符用于Linux的shell命令(如文件名相关操作)中,而正则表达式用于文本内容中的字符串搜索和替换等。通配符是Linux系统本身就支持的,而正则表达式用于vim编辑器或awk程序,这些文本处理工具正是由于支持正则表达式才变得强大。

    通配符

    [a-z]或[12]:匹配方括号中指定范围内的单个字符或方括号列出的其中一个字符。

    [!9]:不匹配方括号中所列字符或指定范围内的单个字符。

    *:匹配0个字符或多个字符。

    ?:匹配任何单个字符,且不能为空字符。

    由于shell会将字符?[ ] * 区别对待,因此在命令参数时如果需要用到这几个特殊字符,应将该参数用单引号标注或通过在特殊字符前加转义字符。

    正则表达式基本语法

    一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串。

    选择

    |竖直分隔符表示选择,例如"boy|girl"可以匹配"boy"或者"girl"

    数量限定

    数量限定除了我们举例用的*,还有+加号,?问号,.点号,如果在一个模式中不加数量限定符则表示出现一次且仅出现一次

    +表示前面的字符必须出现至少一次(1次或多次),例如,"goo+gle",可以匹配"gooogle","goooogle"等;

    ?表示前面的字符最多出现一次(0次或1次),例如,"colou?r",可以匹配"color"或者"colour";

    *星号代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次),例如,“0*42”可以匹配42、042、0042、00042等。

    范围和优先级

    ()圆括号可以用来定义模式字符串的范围和优先级,这可以简单的理解为是否将括号内的模式串作为一个整体。例如,"gr(a|e)y"等价于"gray|grey",(这里体现了优先级,竖直分隔符用于选择a或者e而不是gra和ey),"(grand)?father"匹配father和grandfather(这里体验了范围,?将圆括号内容作为一个整体匹配)。

    语法

    正则表达式有多种不同的风格,下面列举一些常用的作为PCRE子集的适用于perlpython编程语言及grepegrep的正则表达式匹配规则:(由于markdown表格解析的问题,下面的竖直分隔符用全角字符代替,实际使用时请换回半角字符)

    PCRE(Perl Compatible Regular Expressions中文含义:perl语言兼容正则表达式)是一个用C语言编写的正则表达式函数库,由菲利普.海泽(Philip Hazel)编写。PCRE是一个轻量级的函数库,比Boost之类的正则表达式库小得多。PCRE十分易用,同时功能也很强大,性能超过了POSIX正则表达式库和一些经典的正则表达式库。

    字符 描述
    将下一个字符标记为一个特殊字符、或一个原义字符。例如,“n”匹配字符“n”。“ ”匹配一个换行符。序列“”匹配“”而“(”则匹配“(”。
    ^ 匹配输入字符串的开始位置
    $ 匹配输入字符串的结束位置
    {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o
    {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”
    {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格
    * 匹配前面的子表达式零次或多次。例如,zo能匹配“z”、“zo”以及“zoo”。等价于{0,}
    + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}
    ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等价于{0,1}
    ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”
    . 匹配除“ ”之外的任何单个字符。要匹配包括“ ”在内的任何字符,请使用像“(.| )”的模式
    ((pattern)) 匹配pattern并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用“(”或“)”
    x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”
    [xyz] 字符集合(character class)。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。其中特殊字符仅有反斜线保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符 - 如果出现在字符串中间表示字符范围描述;如果如果出现在首位则仅作为普通字符。
    [^xyz] 排除型(negate)字符集合。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”
    [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符
    [^a-z] 排除型的字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符

    优先级

    优先级为从上到下从左到右,依次降低:

    运算符 说明
    转义符
    (), (?:), (?=), [] 括号和中括号
    *+?{n}{n,}{n,m} 限定符
    ^$任何元字符 定位点和序列
    选择

    正则表达式思维导图

    参考

    正则表达式基础

    正则表达式wiki

    几种正则表达式引擎的语法差异

    各语言各平台对正则表达式的支持

  • 相关阅读:
    parent
    「百度一下,你就知道。总结一下,才是你的。」写出我心(三十九)
    「靠自己」​​​​​​​​​​写出我心(五十二)
    bat方式备份文件并删除历史备份
    「利用思维导图做读书笔记」​​​​​​​​​写出我心(五十一)
    「讨厌的事情放在第一位」写出我心(五十)
    「​学会控制自己的情绪」写出我心(四十九)
    「跑步」写出我心(四十八)
    ​​​​​​「番茄工作法」写出我心(四十七)
    「学好英语的重要性」​​​​写出我心(四十六)
  • 原文地址:https://www.cnblogs.com/tangyouwei/p/5482145.html
Copyright © 2011-2022 走看看