learn.regex.2.md

2019-12-12  本文已影响0人  Gravition

贪婪 and 非贪婪

这个语法用来描述自同构现象

  1. 非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 例如,对于字符串 ooooo+? 将匹配单个 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 非单词边界匹配。

注意

  1. 不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式。
  2. 若要匹配一行文本开始处的文本,请在正则表达式的开始使用 ^ 字符。不要将 ^ 的这种用法与中括号表达式内的用法混淆。
  3. 若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用 $ 字符

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

用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。
但用圆括号会有一个副作用,使相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。

上一篇下一篇

猜你喜欢

热点阅读