天马行空的队长 發表於 2023-5-28 12:25:47

正则表达式之字符组[ ](Character Classes)

<p>字符组是正则表达式最基本的结构之一。字符组表示&ldquo;同一位置上可能出现的各种字符&rdquo;,写法:[ ]方括号之间列出所有可能出现的字符。例如:、、[#.?]等等。具体含义:表示在同一个位置上可能出现0-9中任意一个数,重点强调是一位和一个数。此外,字符组中的字符出现顺序和出现次数对字符组没有影响,和是完全一致的。</p>
<p>范围表示法:是不是忒长了?OK,用-表示范围,即:,如此一来是不是多快好省。但是要注意一点,不能9-0,因为9大于0啊。那如果是字母呢,可以或者,也不能z-a或者Z-A,因为在ASCII码表中每个字符都是有一个十进制码值的,如:0是45,A是65,a是97。而范围表示是码值小的-码值大的,按照书写规范上,应该是0-9,A-Z,a-z,切记不要错误认为A-z表示26个大写字母和26个小写字母,它们之间还有其他字母呢。大、小写字母表示方法为:.</p>
<p>[]能够匹配所包含的一系列字符中的任意一个。需要注意的是,[]虽然能匹配其中的任意一个字符,但匹配的结果只能是一个字符,不是多个。</p>
<p>例如表示字符&ldquo;a&rdquo;或&ldquo;b&rdquo;或&ldquo;c&rdquo;。&nbsp;</p>
<p>[]支持用连字符&ldquo;-&rdquo;连接两个字符,来表示一个字符范围。需要注意的是,&ldquo;-&rdquo;前后的两个字符是有顺序的,即使用相同的编码时,后面的字符码位应大于或等于前面字符的码位。</p>
<p>例如表示任意一个小写字母。而在程序中使用则会报&ldquo; 范围的顺序颠倒&rdquo;这样的异常。</p>
<p>大部分在正则中有特殊意义、在匹配其本身时需转义的字符,在[]内是不需要转义的。必须转义的只有&ldquo;\&rdquo;、&ldquo;[&rdquo;和&ldquo;]&rdquo;,而&ldquo;^&rdquo;出现在[]开始位置,&ldquo;-&rdquo;前后构成范围区间时,需要转义,出现在其它位置不需要转义,例如[\^.$^{\[(|)*+?-\\]</p>
<p>在.NET中,不构成歧义的情况下,&ldquo;[&rdquo;和&ldquo;]&rdquo;可以不用转义,程序也可以得到预期结果,但是这种写法可读性较差,而且出现错误时不易排查,因此不推荐这种写法</p>
<p>举例:Regex reg = new Regex(&quot;[^]]+&quot;);&nbsp; //不推荐</p>
<p>.NET的字符组中支持集合减法,语法],例如]表示除元音外的小写字母。但是除非你很了解这种语法的支持范围,以及确实有必要这样做,否则不要轻易使用这种可读性较差的语法。事实上完全可以用多个范围区间,在区间较多,导致可读性差、容易出错的情况下,可以使用正向预搜索来实现以上需求,(?!),这种语法规则,支持范围要大得多,可读性也要好一些。</p>
<p><strong>常见错误用法:</strong></p>
<p>因为[]本身表示的就是字符之间&ldquo;或&rdquo;的关系,因此在[]中使用&ldquo;|&rdquo;来表示&ldquo;或&rdquo;的关系是错误的。</p>
<p>举例:表示的是&ldquo;a&rdquo;或&ldquo;b&rdquo;或&ldquo;c&rdquo;或&ldquo;|&rdquo;中的任意一个字符。<br />&nbsp;</p>
<p>举例</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;源字符串:ab|ac<br />&nbsp; &nbsp; &nbsp; &nbsp;正则表达式:+<br />&nbsp; &nbsp; &nbsp; &nbsp;匹配结果:ab|ac</p>
<p>[^ ] 排除型字符组</p>
<p>&nbsp; &nbsp; &nbsp;[^ ]表示匹配任意一个未列举的字符,同样的,匹配的结果也只能是一个字符。<br />&nbsp; &nbsp; 例如[^abc]表示除字符&ldquo;a&rdquo;、&ldquo;b&rdquo;、&ldquo;c&rdquo;外的任意一个字符。<br />&nbsp; &nbsp; [^ ]也支持字符分组,例如[^0-9]表示除数字外的任意一个字符。</p>
<p>&nbsp;新手最容易犯的错误就是,用[^abc]或[^(abc)]这样的表达式来匹配不包含&ldquo;abc&rdquo;子字符串的字符串。&nbsp; &nbsp;&nbsp;</p>
<p>举例</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;源字符串:string yourStr = &quot;&lt;aaa&gt;bbb&lt;abc&gt;ccc&lt;ddd&gt;&quot;;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;规则描述:取出yourStr中格式为&lt;...&gt;,但&lt;&gt;中不是abc的内容</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;预期结果:&lt;aaa&gt;、&lt;ddd&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;错误写法:&lt;[^abc]*&gt;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp;正确写法:<code>&lt;(?!abc&gt;)[^&gt;]*&gt;</code>&nbsp; &nbsp; &nbsp;</p>
<p>还有一点并不常见,\b在字符组外表示单词边界,但是在字符组内[\b]表示退格符。</p>
頁: [1]
查看完整版本: 正则表达式之字符组[ ](Character Classes)