正则基础之——【】字符组

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

    例如 [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] 表示退格符。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值