当前位置: 首页 > news >正文

【转】[ ] 字符组(Character Classes)

源地址

 

 

    []能够匹配所包含的一系列字符中的任意一个。需要注意的是,[]虽然能匹配其中的任意一个字符,但匹配的结果只能是一个字符,不是多个。

    例如[abc]表示字符“a”或“b”或“c”。

 

    []支持用连字符“-”连接两个字符,来表示一个字符范围。需要注意的是,“-”前后的两个字符是有顺序的,即使用相同的编码时,后面的字符码位应大于或等于前面字符的码位。

    例如[a-z]表示任意一个小写字母。而在程序中使用[z-a]则会报“[x-y] 范围的顺序颠倒”这样的异常。

 

    大部分在正则中有特殊意义、在匹配其本身时需转义的字符,在[]内是不需要转义的。必须转义的只有“\”、“[”和“]”,而“^”出现在[]开始位置,“-”前后构成范围区间时,需要转义,出现在其它位置不需要转义,例如[\^.$^{\[(|)*+?-\\]

    .NET中,不构成歧义的情况下,“[”和“]”可以不用转义,程序也可以得到预期结果,但是这种写法可读性较差,而且出现错误时不易排查,因此不推荐这种写法

    举例:Regex reg = new Regex("[^]]+");  //不推荐

    .NET的字符组中支持集合减法,语法[set1-[set2]],例如[a-z-[aeiou]]表示除元音外的小写字母。但是除非你很了解这种语法的支持范围,以及确实有必要这样做,否则不要轻易使用这种可读性较差的语法。事实上完全可以用多个范围区间[b-df-hj-np-tv-z],在区间较多,导致可读性差、容易出错的情况下,可以使用正向预搜索来实现以上需求,(?![aeiou])[a-z],这种语法规则,支持范围要大得多,可读性也要好一些。

常见错误用法:

    因为[]本身表示的就是字符之间“或”的关系,因此在[]中使用“|”来表示“或”的关系是错误的。

举例:[a|b|c]表示的是“a”或“b”或“c”或“|”中的任意一个字符。

 

举例

       源字符串:ab|ac

       正则表达式:[a|b|c]+

       匹配结果:ab|ac

 

 

[^ ]排除型字符组

 

    [^ ]表示匹配任意一个未列举的字符,同样的,匹配的结果也只能是一个字符。

    例如[^abc]表示除字符“a”、“b”、“c”外的任意一个字符。

    [^ ]也支持字符分组,例如[^0-9]表示除数字外的任意一个字符。

 

    新手最容易犯的错误就是,用[^abc][^(abc)]这样的表达式来匹配不包含“abc”子字符串的字符串。    

举例

       源字符串:string yourStr = "<aaa>bbb<abc>ccc<ddd>";

       规则描述:取出yourStr中格式为<...>,但<>中不是abc的内容

       预期结果:<aaa><ddd>

       错误写法:<[^abc]*>

       正确写法:<(?!abc>)[^>]*>

     

还有一点并不常见,\b在字符组外表示单词边界,但是在字符组内[\b]表示退格符。

 

转载于:https://www.cnblogs.com/pmars/archive/2011/12/30/2307325.html

相关文章:

  • .NET下的多线程编程—1-线程机制概述
  • ASP.NET MVC案例教程(基于ASP.NET MVC beta)——第六篇:拦截器
  • 关于lync安装问题
  • Android SurfaceView
  • 明晰Silverlight中的依赖属性
  • rc.local自启动学习
  • Qt游戏编程_02
  • 超级终端使用简介
  • 粘包、丢包及TCP信息收发
  • 超前引用
  • Java中的volatile关键字-转载
  • jsp---EL存取器
  • 如何可以导入注册表文件时不提示?
  • 第八章异常和断言
  • VC++播放音频文件和音频数据的方法
  • JavaScript-如何实现克隆(clone)函数
  • 【comparator, comparable】小总结
  • 5、React组件事件详解
  • canvas绘制圆角头像
  • Docker容器管理
  • HashMap剖析之内部结构
  • Mysql数据库的条件查询语句
  • node.js
  • Node项目之评分系统(二)- 数据库设计
  • PAT A1017 优先队列
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 开源SQL-on-Hadoop系统一览
  • 试着探索高并发下的系统架构面貌
  • 项目管理碎碎念系列之一:干系人管理
  • 正则与JS中的正则
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 阿里云ACE认证学习知识点梳理
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #### go map 底层结构 ####
  • $.each()与$(selector).each()
  • ${factoryList }后面有空格不影响
  • (42)STM32——LCD显示屏实验笔记
  • (Git) gitignore基础使用
  • (第27天)Oracle 数据泵转换分区表
  • (第61天)多租户架构(CDB/PDB)
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (顺序)容器的好伴侣 --- 容器适配器
  • (算法设计与分析)第一章算法概述-习题
  • (循环依赖问题)学习spring的第九天
  • (转)Mysql的优化设置
  • (转)四层和七层负载均衡的区别
  • (转)原始图像数据和PDF中的图像数据
  • ***详解账号泄露:全球约1亿用户已泄露
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 反射 Reflect
  • .net 简单实现MD5
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例