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

来源:互联网 发布:淘宝心愿单有什么用 编辑:程序博客网 时间:2024/05/29 13:48

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

    一、元字符[] 

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

    例如:[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}|0\b

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

      那看一个简单的:写出能够匹配十进制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这也是比较符合正则表达式默认的贪婪模式的。


         三元字符之转义字符

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

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

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

      \t 匹配一个制表符

      \v 匹配一个垂直制表符

      \r 匹配一个回车符

      \n 匹配一个换行符

      \f 匹配一个换页符

      \s 匹配一个任何空白字符,等价于[\f\t\v\r\n]

      \S 匹配一个非空白字符,等价于[^\f\t\v\r\n]

      \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码表上来进行匹配。见图:


      

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 铝合金的渣子整到眼睛里怎么办 铁锅手柄上的铆钉拧不动怎么办 喂完鱼鱼缸上边飘着一层油膜怎么办 铸铁管道横着排的结口漏水怎么办 缤智行李架免打孔螺丝款怎么办 前保险杠和叶子板缝隙大怎么办 新奥拓的大灯调节螺丝滑丝了怎么办 小米手环2计步不准怎么办 小米手环3计步不准怎么办 眼镜用洗发水洗了后模糊怎么办 雷朋近视镜眼镜腿折了怎么办 近视镜眼镜腿断了该怎么办 老师把学生的眼镜打坏了怎么办 生死狙击忘了密保改不了密码怎么办 我叫mt狂猎之弓怎么办 你能利用你的弱点打击你怎么办 研控两相混合伺服电机反转怎么办? 战地一要我升级显卡驱动怎么办 刺客信条兄弟会存档损坏了怎么办 电脑上所有软件和文件被删了怎么办 电脑显示文件已打开无法删除怎么办 金立手机桌面停止运行黑屏怎么办 苹果平板电脑玩游戏黑屏闪退怎么办 电脑开机时显示无法找到入口怎么办 我的世界显示网络玩不了的怎么办啊 网页被设置成不可以到下一页怎么办 小天鹅热水器排污螺丝拧不动怎么办 葡萄霜霉严重叶片开始发焦了怎么办 上海高架gps定位信号差怎么办 老公开车技术不行还非要开怎么办 我偷了同学手机被发现应该怎么办 没满月孩孑4天没大便了怎么办 电机轴总是从皮带轮处断裂怎么办 天花板吊顶里的热水管经常坏怎么办 摩托车油箱下面的废油管漏油怎么办 大修机械压力机轴取不下来怎么办 萌侠传说账号密码没了怎么办 车子前保护杠塑料刮花了怎么办 糖猫电话手表关机了找不到了怎么办 小天才电话手表被洗衣机洗了怎么办 小天才电话手表放洗衣机洗了怎么办