learn.regex.2.md
贪婪 and 非贪婪
这个语法用来描述自同构现象
- 非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 例如,对于字符串
oooo
,o+?
将匹配单个o
,而o+
将匹配所有o
。
*
、+
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?
就可以实现非贪婪或最小匹配。
例如,你可能搜索 HTML 文档,以查找在 h1
标签内的内容。HTML 代码如下:
<h1>RUNOOB-菜鸟教程</h1>
贪婪:下面的表达式匹配整个<h1>RUNOOB-菜鸟教程</h1>
/<.*>/
非贪婪:下面的非贪婪表达式只匹配<h1>
。
/<.*?>/
也可以使用以下正则表达式来匹配 h1
标签,表达式则是
/<\w+?>/
通过在 *
、+
或 ?
限定符之后放置 ?
,该表达式从"贪婪"表达式转换为"非贪婪"表达式或者最小匹配。
定位符
它们是特殊的一个 class,用来描述字符串或单词的边界。
^
和 $
分别指字符串的开始与结束,
\b
描述单词的前或后边界,\B
表示非单词边界。
定位符使你能够将正则表达式固定到行首或行尾。
它们还可以用来构造这样的正则表达式:
出现在一个单词内、在一个单词的开头或者一个单词的结尾。
正则表达式的定位符有:
字符 | 描述 |
---|---|
^ |
匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。 |
$ |
匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前的位置匹配。 |
\b |
匹配一个单词边界,即字与空格间的位置。 |
\B |
非单词边界匹配。 |
注意
- 不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如
^*
之类的表达式。 - 若要匹配一行文本开始处的文本,请在正则表达式的开始使用
^
字符。不要将^
的这种用法与中括号表达式内的用法混淆。 - 若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用
$
字符
example
搜索章节标题
下面的正则表达式匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首:
/^Chapter [1-9][0-9]{0,1}/
真正的章节标题不仅出现行的开始处,而且它还是该行中仅有的文本。
它即出现在行首又出现在同一行的结尾。
下面的表达式能确保指定的匹配只匹配章节而不匹配交叉引用。
通过创建只匹配一行文本的开始和结尾的正则表达式,就可做到这一点。
/^Chapter [1-9][0-9]{0,1}$/
匹配单词边界稍有不同,但向正则表达式添加了很重要的能力。
单词边界是单词和空格之间的位置。非单词边界是任何其他位置。
下面的表达式匹配单词 Chapter
的开头三个字符,因为这三个字符出现在单词边界后面:
/\bCha/
\b
字符的位置是非常重要的。
如果它位于正则表达式中 要匹配的字符串的开始,它匹配单词的开始处。
如果它位于正则表达式中 字符串的结尾,它匹配单词的结尾处。
例如,下面的表达式匹配单词 Chapter
中的字符串 ter
,因为它出现在单词结尾边界的前面:
/ter\b/
下面的表达式匹配 Chapter
中的字符串 apt
,但不匹配 aptitude
中的字符串 apt
:
/\Bapt/
字符串 apt
出现在单词 Chapter
中的非单词边界处,但出现在单词 aptitude
中的单词边界处。
对于 \B
非单词边界运算符,位置并不重要,因为匹配不关心究竟是单词的开头还是结尾。
选择
相当于数学逻辑关系中的And
或者 Or
用圆括号将所有选择项括起来,相邻的选择项之间用|
分隔。
但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:
放在第一个选项前来消除这种副作用。