素材巴巴 > 程序开发 >

[正则表达式]-基础语法三 其他特殊字符与转义字符

程序开发 2023-09-13 19:10:52

      本篇文章将对剩下的元字符进行描述记录,包括特殊字符与转义字符.

    一、元字符[] 

    []符号对表示了一个字符类,其占用一个字符位置,表示匹配其中的任何一个。

    例如:[012345]

    表示可以匹配一个数字,且这个数字在属于012345中的任何一个。又如:[ab23]可以匹配a或者b或者2或者3。即只能选[]符号所包含字符中的一个。

     在[]中,有些符号的意义发生了变化。

      比如^  在[]中的含义是“非”,而在[]之外是匹配字符串开头的位置,或者在Multiline模式下还可以匹配n之后和r之后的位置。如:[^abc123]  在这里就是说除了abc123这三个符号,其他符号的都能被匹配。

      再比如-   在[]中的含义是表示一个范围,而在[]之外就单纯的是匹配字符-   如:[a-c]表示的是从a到c这三个字符中的任意一个都可以被匹配。这里可以简单的理解为“到”的意思。并且这里的范围依据是ASCII码表,比如从0到9就可以表示为[0-9],从a到z就可以表示为[a-z],从A-Z就可以表示为[A-Z]

     这里就需要注意一个问题了,如果在[]中我要表示在abc-四个字符中选择一个呢?很容易知道,肯定不是[a-c]这种形式,因为如果是这种形式的话,匹配的将会是abc三个字符中的一个了。那么可以这样写[a-c-]   [abc-]   [-a-c]   [-abc]   [a-bc]这几种经过测试都是可以对字符-进行匹配的。归结起来就是符号-放在首尾或者使用转义才表示的是对其本身进行匹配,否则都是依据ASCII码表表示一个范围。

      同理^  如果也想在[]内表示原本的含义,则需要使用转义形式。这里特别要注意的一点是:[^ab]这个正则表达式会匹配除了ab之外的字符,诸如:cdefg&*$%#@^等,注意!由于符号^不属于ab中的任何一个,所以依然会被识别。如果不想识别^  你所需要写的正则表达式为:[^^ab]或者是[^^ab],这两种形式都是可以的。

      -------------------------------------------------------------------------------------------

      作为一个过渡,笔者写一个例子,结合上两篇博文中的定位符和限定符。

      例如:请写出可以匹配十六进制数0-ABCD的正则表达式为:

      b(A|a)(B|b)(C|c)[0-9A-Da-d]|(A|a)(B|b)[0-9A-Ba-b][0-9A-Fa-f]|(a|A)[0-9][0-9A-Fa-f]{2}|[1-9][0-9A-Fa-f]{3}|[1-9A-Fa-f][1-9A-Fa-f]{0,2}|0b

      在这道题中涉及到一些还没有将到的知识,如果看不懂也不用着急,涉及优先级与元字符|的知识。

      那看一个简单的:写出能够匹配十进制0-223的正则表达式。

      结果为     22[0-3]|2[0-1][0-9]|1[0-9]{2}|[1-9][0-9]?|0

      可能会有人问为什么不能反过来写为  0|[1-9][0-9]?|1[0-9]{2}|2[0-1][0-9]|22[0-3]呢?原因在于如果摆在你面前有一个十进制数为:210,你是想匹配210呢还是匹配2呢?答案当然是匹配210了,由于元字符|具有左侧优先性,比方说:正则表达式a|ab,那么在字符串aba中,将会匹配两个a  ,如图:


     这里题目就算是简单学习了。

      -------------------------------------------------------------------------------------------


    二、元字符 |

      此元字符的含义是“或”,在相关书籍参考中定义为“替换”。如:正则表达式:z|food  可以匹配的是:z或者food,因为元字符|的优先级是最低的,所以最后运算。而()可以改变优先级,又如:(z|f)ood    可以匹配的是zood或者food

元字符|的优先级最低,导致了如果没有()干扰的话,将各个部分分析完毕之后再取或。往往一个元字符|就隔绝了两个可能行。

      同时元字符 | 具有左侧优先性,譬如说:a|ab要优先匹配a的,如果要匹配字符串abc  ,那么只会匹配到字符a  。所以,一旦涉及到元字符 | 的话,请注意其左侧优先性的问题,如果左侧满足条件了,就不再对是否满足右侧进行判定。正确的思路可以从数学表示为:从左到右集合的范围依次减小,条件逐渐严苛。所以比较符合逻辑的正则表达式应为 ab|a这也是比较符合正则表达式默认的贪婪模式的。


         三、元字符之转义字符

      转义字符有很多也很简单,这里笔者一起说明(除去了前面博文所讲的定位符bB)。

      d 匹配一个数字字符,等价于 [0-9]

      D 匹配一个非数字字符,等价于[^0-9]

      t 匹配一个制表符

      v 匹配一个垂直制表符

      r 匹配一个回车符

      n 匹配一个换行符

      f 匹配一个换页符

      s 匹配一个任何空白字符,等价于[ftvrn]

      S 匹配一个非空白字符,等价于[^ftvrn]

      w 匹配一个单词字符,等价于[0-9a-zA-Z_]  注意,这里包括了下划线_  ,符合编程语言中变量的命名规则:数              字、字母、下划线,且不能以数字开头。

      W 匹配一个非单词字符,等价于[^0-9A-Za-z_]

     xn 匹配一个转义字符,对n的要求是两位十六进制。比方说x41 可以匹配A ,x412 则可以匹配A2。重点是之识              别两位十六进制数。

      n 标识一个八进制转义值或者一个向后引用。如果n之前至少有n个子表达式被默认命名,则n为向后引用,否则,如果n为八进制数字,则n为一个八进制转义值。这里虽然没有说有几位,但笔者可以告诉你只要在ASCII码表上可以找到,就默认为转义字符,目前最大的可以为177匹配的是delete按键。176匹配字符~  。而1763匹配的将是~3  见图:


       um 匹配的是四位十六进制数,对应的是Unicode表上的符号,比如:汉字匹配正则表达式为:[u4e00-u9fa5] 要与此前的xn和n相做对比,前者是在ASCII码表上来进行匹配,而后者是在更大的Unicode码表上来进行匹配。见图:


      


标签:

上一篇: vscode 规则配置 下一篇:
素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。