<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Regex on LeafCxy's Blog</title><link>https://leafcxy.github.io/tags/regex/</link><description>Recent content in Regex on LeafCxy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 21 Nov 2025 02:32:04 +0000</lastBuildDate><atom:link href="https://leafcxy.github.io/tags/regex/index.xml" rel="self" type="application/rss+xml"/><item><title>正则表达式30分钟入门教程</title><link>https://leafcxy.github.io/posts/2025-11-21/</link><pubDate>Fri, 21 Nov 2025 02:32:04 +0000</pubDate><guid>https://leafcxy.github.io/posts/2025-11-21/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://deerchao.cn/tutorials/regex/regex.htm"&gt;https://deerchao.cn/tutorials/regex/regex.htm&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="本文目标"&gt;本文目标&lt;/h2&gt;
&lt;p&gt;30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id="如何使用本教程"&gt;如何使用本教程&lt;/h2&gt;
&lt;p&gt;别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正则表达式其实并没有想像中的那么困难。当然，如果你看完了这篇教程之后，发现自己明白了很多，却又几乎什么都记不得，那也是很正常的——我认为，没接触过正则表达式的人在看完这篇教程后，能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理，以后你还需要多练习，多使用，才能熟练掌握正则表达式。&lt;/p&gt;
&lt;p&gt;除了作为入门教程之外，本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说，这个目标还是完成得不错的——你看，我自己也没能把所有的东西记下来，不是吗？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;清除格式&lt;/code&gt; 文本格式约定：&lt;code&gt;专业术语&lt;/code&gt; &lt;code&gt;元字符/语法格式&lt;/code&gt; &lt;code&gt;正则表达式&lt;/code&gt; &lt;code&gt;正则表达式中的一部分(用于分析)&lt;/code&gt; &lt;code&gt;对其进行匹配的源字符串&lt;/code&gt; &lt;code&gt;对正则表达式或其中一部分的说明&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;隐藏边注&lt;/code&gt; 本文右边有一些注释，主要是用来提供一些相关信息，或者给没有程序员背景的读者解释一些基本概念，通常可以忽略。&lt;/p&gt;
&lt;p&gt;本文介绍的大部分正则语法，在不同的正则表达式引擎中都可以使用，但也有一些会有所差异。本文介绍的是 .Net 下的正则表达式，其它环境下的具体情况可以在读完本文后去参考官方文档，或者查看&lt;a href="https://deerchao.cn/tutorials/regex/diffs.html"&gt;正则表达式引擎特性对比&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="正则表达式到底是什么东西"&gt;正则表达式到底是什么东西？&lt;/h2&gt;
&lt;p&gt;在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说，&lt;code&gt;正则表达式&lt;/code&gt;就是记录文本规则的代码。&lt;/p&gt;
&lt;p&gt;很可能你使用过Windows/Dos下用于文件查找的&lt;code&gt;通配符(wildcard)&lt;/code&gt;，也就是&lt;code&gt;*&lt;/code&gt;和&lt;code&gt;?&lt;/code&gt;。如果你想查找某个目录下的所有的Word文档的话，你会搜索&lt;code&gt;*.doc&lt;/code&gt;。在这里，&lt;code&gt;*&lt;/code&gt;会被解释成任意的字符串。和通配符类似，正则表达式也是用来进行文本匹配的工具，只不过比起通配符，它能更精确地描述你的需求——当然，代价就是更复杂——比如你可以编写一个正则表达式，用来查找&lt;code&gt;所有以0开头，后面跟着2-3个数字，然后是一个连字号“-”，最后是7或8位数字的字符串&lt;/code&gt;(像010-12345678或0376-7654321)。&lt;/p&gt;
&lt;h2 id="入门"&gt;入门&lt;/h2&gt;
&lt;p&gt;学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。&lt;/p&gt;
&lt;p&gt;假设你在一篇英文小说里查找&lt;code&gt;hi&lt;/code&gt;，你可以使用正则表达式&lt;code&gt;hi&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这几乎是最简单的正则表达式了，它可以精确匹配这样的字符串：&lt;code&gt;由两个字符组成，前一个字符是h,后一个是i&lt;/code&gt;。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配&lt;code&gt;hi,HI,Hi,hI&lt;/code&gt;这四种情况中的任意一种。&lt;/p&gt;
&lt;p&gt;不幸的是，很多单词里包含&lt;code&gt;hi&lt;/code&gt;这两个连续的字符，比如&lt;code&gt;him,history,high&lt;/code&gt;等等。用hi来查找的话，这里边的&lt;code&gt;hi&lt;/code&gt;也会被找出来。如果要&lt;code&gt;精确地查找hi这个单词&lt;/code&gt;的话，我们应该使用&lt;code&gt;\bhi\b&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;\b&lt;/code&gt;是正则表达式规定的一个特殊代码（好吧，某些人叫它&lt;code&gt;元字符，metacharacter&lt;/code&gt;），代表着&lt;code&gt;单词的开头或结尾，也就是单词的分界处&lt;/code&gt;。虽然通常英文的单词是由空格，标点符号或者换行来分隔的，但是&lt;code&gt;\b&lt;/code&gt;并不匹配这些单词分隔字符中的任何一个，它只&lt;code&gt;匹配一个位置&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;假如你要找的是&lt;code&gt;hi后面不远处跟着一个Lucy&lt;/code&gt;，你应该用&lt;code&gt;\bhi\b.*\bLucy\b&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里，&lt;code&gt;.&lt;/code&gt;是另一个元字符，匹配&lt;code&gt;除了换行符以外的任意字符&lt;/code&gt;。&lt;code&gt;*&lt;/code&gt;同样是元字符，不过它代表的不是字符，也不是位置，而是数量——它指定&lt;code&gt;*``前边的内容可以连续重复使用任意次以使整个表达式得到匹配&lt;/code&gt;。因此，&lt;code&gt;.*&lt;/code&gt;连在一起就意味着&lt;code&gt;任意数量的不包含换行的字符&lt;/code&gt;。现在&lt;code&gt;\bhi\b.*\bLucy\b&lt;/code&gt;的意思就很明显了：&lt;code&gt;先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果同时使用其它元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0\d\d-\d\d\d\d\d\d\d\d&lt;/code&gt;匹配这样的字符串：&lt;code&gt;以0开头，然后是两个数字，然后是一个连字号“-”，最后是8个数字&lt;/code&gt;(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。&lt;/p&gt;
&lt;p&gt;这里的&lt;code&gt;\d&lt;/code&gt;是个新的元字符，匹配&lt;code&gt;一位数字(0，或1，或2，或……)&lt;/code&gt;。&lt;code&gt;-&lt;/code&gt;不是元字符，只匹配它本身——连字符(或者减号，或者中横线，或者随你怎么称呼它)。&lt;/p&gt;
&lt;p&gt;为了避免那么多烦人的重复，我们也可以这样写这个表达式：&lt;code&gt;0\d{2}-\d{8}&lt;/code&gt;。这里&lt;code&gt;\d&lt;/code&gt;后面的&lt;code&gt;{2}&lt;/code&gt;(&lt;code&gt;{8}&lt;/code&gt;)的意思是前面&lt;code&gt;\d``必须连续重复匹配2次(8次)&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="测试正则表达式"&gt;测试正则表达式&lt;/h2&gt;
&lt;p&gt;如果你不觉得正则表达式很难读写的话，要么你是一个天才，要么，你不是地球人。正则表达式的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，所以找一种工具对正则表达式进行测试是很有必要的。&lt;/p&gt;
&lt;p&gt;不同的环境下正则表达式的一些细节是不相同的，本教程介绍的是微软 .Net Framework 4.x 下正则表达式的行为，所以，我向你推荐我编写的.Net下的工具 &lt;a href="https://deerchao.cn/tools/regester/"&gt;Regester&lt;/a&gt;。请参考该页面的说明来安装和运行该软件。&lt;/p&gt;
&lt;p&gt;下面是Regester运行时的截图：&lt;/p&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://leafcxy.github.io/images/2025/2025-13.png"&gt;&lt;/p&gt;
&lt;h2 id="元字符"&gt;元字符&lt;/h2&gt;
&lt;p&gt;现在你已经知道几个很有用的元字符了，如&lt;code&gt;\b,.,*&lt;/code&gt;，还有&lt;code&gt;\d.&lt;/code&gt;正则表达式里还有更多的元字符，比如&lt;code&gt;\s&lt;/code&gt;匹配&lt;code&gt;任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等&lt;/code&gt;。&lt;code&gt;\w&lt;/code&gt;匹配&lt;code&gt;字母或数字或下划线或汉字等&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;下面来看看更多的例子：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\ba\w*\b&lt;/code&gt;匹配以字母a开头的单词——先是某个单词开始处(\b)，然后是字母a,然后是任意数量的字母或数字(&lt;code&gt;\w*&lt;/code&gt;)，最后是单词结束处(\b)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\d+&lt;/code&gt;匹配1个或更多连续的数字。这里的&lt;code&gt;+&lt;/code&gt;是和&lt;code&gt;*&lt;/code&gt;类似的元字符，不同的是&lt;code&gt;*&lt;/code&gt;匹配重复任意次(可能是0次)，而&lt;code&gt;+&lt;/code&gt;则匹配重复1次或更多次。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\b\w{6}\b&lt;/code&gt; 匹配刚好6个字符的单词。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用的元字符&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;匹配除换行符以外的任意字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\w&lt;/code&gt;匹配字母或数字或下划线或汉字&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\s&lt;/code&gt;匹配任意的空白符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\d&lt;/code&gt;匹配数字&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\b&lt;/code&gt;匹配单词的开始或结束&lt;/li&gt;
&lt;li&gt;&lt;code&gt;^&lt;/code&gt;匹配字符串的开始&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$&lt;/code&gt;匹配字符串的结束&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;元字符&lt;code&gt;^&lt;/code&gt;（和数字6在同一个键位上的符号）和&lt;code&gt;$&lt;/code&gt;都匹配一个位置，这和&lt;code&gt;\b&lt;/code&gt;有点类似。&lt;code&gt;^&lt;/code&gt;匹配你要用来查找的字符串的开头，&lt;code&gt;$&lt;/code&gt;匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：&lt;code&gt;^\d{5,12}$&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里的{5,12}和前面介绍过的{2}是类似的，只不过{2}匹配只能不多不少重复2次，{5,12}则是重复的次数不能少于5次，不能多于12次，否则都不匹配。&lt;/p&gt;
&lt;p&gt;因为使用了&lt;code&gt;^&lt;/code&gt;和&lt;code&gt;$&lt;/code&gt;，所以输入的整个字符串都要用来和&lt;code&gt;\d{5,12}&lt;/code&gt;来匹配，也就是说整个输入必须是5到12个数字，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。&lt;/p&gt;
&lt;p&gt;和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，&lt;code&gt;^&lt;/code&gt;和&lt;code&gt;$&lt;/code&gt;的意义就变成了匹配行的开始处和结束处。&lt;/p&gt;
&lt;h2 id="字符转义"&gt;字符转义&lt;/h2&gt;
&lt;p&gt;如果你想查找元字符本身的话，比如你查找&lt;code&gt;.&lt;/code&gt;,或者&lt;code&gt;*&lt;/code&gt;,就出现了问题：你没办法指定它们，因为它们会被解释成别的意思。这时你就得使用&lt;code&gt;\&lt;/code&gt;来取消这些字符的特殊意义。因此，你应该使用&lt;code&gt;\.&lt;/code&gt;和&lt;code&gt;\*&lt;/code&gt;。当然，要查找&lt;code&gt;\&lt;/code&gt;本身，你也得用&lt;code&gt;\\&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;例如：&lt;code&gt;deerchao\.cn&lt;/code&gt;匹配deerchao.cn，&lt;code&gt;C:\\Windows&lt;/code&gt;匹配C:\Windows。&lt;/p&gt;
&lt;h2 id="重复"&gt;重复&lt;/h2&gt;
&lt;p&gt;你已经看过了前面的&lt;code&gt;*&lt;/code&gt;,&lt;code&gt;+&lt;/code&gt;,&lt;code&gt;{2}&lt;/code&gt;,&lt;code&gt;{5,12}&lt;/code&gt;这几个匹配重复的方式了。下面是正则表达式中所有的限定符(指定数量的代码，例如&lt;code&gt;*&lt;/code&gt;,&lt;code&gt;{5,12}&lt;/code&gt;等)：&lt;/p&gt;
&lt;p&gt;常用的限定符&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;*&lt;/code&gt;重复零次或更多次&lt;/li&gt;
&lt;li&gt;&lt;code&gt;+&lt;/code&gt;重复一次或更多次&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?&lt;/code&gt;重复零次或一次&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{n}&lt;/code&gt;重复n次&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{n,}&lt;/code&gt;重复n次或更多次&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{n,m}&lt;/code&gt;重复n到m次&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下面是一些使用重复的例子：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Windows\d+&lt;/code&gt;匹配Windows后面跟1个或更多数字&lt;/p&gt;
&lt;p&gt;&lt;code&gt;^\w+&lt;/code&gt;匹配一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)&lt;/p&gt;
&lt;h2 id="字符类"&gt;字符类&lt;/h2&gt;
&lt;p&gt;要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集合的元字符，但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办？&lt;/p&gt;
&lt;p&gt;很简单，你只需要在方括号里列出它们就行了，像&lt;code&gt;[aeiou]&lt;/code&gt;就匹配任何一个英文元音字母，&lt;code&gt;[.?!]&lt;/code&gt;匹配标点符号(&lt;code&gt;.&lt;/code&gt;或&lt;code&gt;?&lt;/code&gt;或&lt;code&gt;!&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;我们也可以轻松地指定一个字符范围，像&lt;code&gt;[0-9]&lt;/code&gt;代表的含意与&lt;code&gt;\d&lt;/code&gt;就是完全一致的：一位数字；同理&lt;code&gt;[a-z0-9A-Z_]&lt;/code&gt;也完全等同于&lt;code&gt;\w&lt;/code&gt;（如果只考虑英文的话）。&lt;/p&gt;
&lt;p&gt;下面是一个更复杂的表达式：&lt;code&gt;\(?0\d{2}[) -]?\d{8}&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这个表达式可以匹配几种格式的电话号码，像&lt;code&gt;(010)88886666&lt;/code&gt;，或&lt;code&gt;022-22334455&lt;/code&gt;，或&lt;code&gt;02912345678&lt;/code&gt;等。我们对它进行一些分析吧：首先是一个转义字符&lt;code&gt;\(&lt;/code&gt;,它能出现0次或1次(&lt;code&gt;?&lt;/code&gt;),然后是一个0，后面跟着2个数字(&lt;code&gt;\d{2}&lt;/code&gt;)，然后是&lt;code&gt;)&lt;/code&gt;或&lt;code&gt;-&lt;/code&gt;或空格中的一个，它出现1次或不出现(&lt;code&gt;?&lt;/code&gt;)，最后是8个数字(&lt;code&gt;\d{8}&lt;/code&gt;)。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“(”和“)”也是元字符，后面的分组节里会提到，所以在这里需要使用转义。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="分枝条件"&gt;分枝条件&lt;/h2&gt;
&lt;p&gt;不幸的是，刚才那个表达式也能匹配&lt;code&gt;010)12345678&lt;/code&gt;或&lt;code&gt;(022-87654321&lt;/code&gt;这样的“不正确”的格式。要解决这个问题，我们需要用到分枝条件。正则表达式里的分枝条件指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用&lt;code&gt;|&lt;/code&gt;把不同的规则分隔开。听不明白？没关系，看例子：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0\d{2}-\d{8}|0\d{3}-\d{7}&lt;/code&gt;这个表达式能匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}&lt;/code&gt;这个表达式匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;\d{5}-\d{4}|\d{5}&lt;/code&gt;这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：使用分枝条件时，要注意各个条件的顺序。如果你把它改成&lt;code&gt;\d{5}|\d{5}-\d{4}&lt;/code&gt;的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时，将会从左到右地测试每个条件，如果满足了某个分枝的话，就不会去再管其它的条件了。&lt;/p&gt;
&lt;h2 id="分组"&gt;分组&lt;/h2&gt;
&lt;p&gt;我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复多个字符又该怎么办？你可以用小括号来指定子表达式(也叫做分组)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;(\d{1,3}\.){3}\d{1,3}&lt;/code&gt;是一个简单的IP地址匹配表达式。要理解这个表达式，请按下列顺序分析它：&lt;code&gt;\d{1,3}&lt;/code&gt;匹配1到3位的数字，&lt;code&gt;(\d{1,3}\.){3}&lt;/code&gt;匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次，最后再加上一个一到三位的数字(&lt;code&gt;\d{1,3}&lt;/code&gt;)。&lt;/p&gt;
&lt;p&gt;不幸的是，它也将匹配&lt;code&gt;256.300.888.999&lt;/code&gt;这种不可能存在的IP地址。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：&lt;code&gt;((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;理解这个表达式的关键是理解&lt;code&gt;2[0-4]\d|25[0-5]|[01]?\d\d?&lt;/code&gt;，这里我就不细说了，你自己应该能分析得出来它的意义。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;IP地址中每个数字都不能大于255. 经常有人问我, 01.02.03.04 这样前面带有0的数字, 是不是正确的IP地址呢? 答案是: 是的, IP 地址里的数字可以包含有前导 0 (leading zeroes).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="反义"&gt;反义&lt;/h2&gt;
&lt;p&gt;有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到反义：&lt;/p&gt;
&lt;p&gt;常用的反义代码&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;\W&lt;/code&gt;匹配任意不是字母，数字，下划线，汉字的字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\S&lt;/code&gt;匹配任意不是空白符的字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\D&lt;/code&gt;匹配任意非数字的字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;\B&lt;/code&gt;匹配不是单词开头或结束的位置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[^x]&lt;/code&gt;匹配除了x以外的任意字符&lt;/li&gt;
&lt;li&gt;&lt;code&gt;[^aeiou]&lt;/code&gt;匹配除了aeiou这几个字母以外的任意字符&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例子：&lt;/p&gt;</description></item></channel></rss>