至此,已经谈论了本义字符和字符集。锚不同于这两种。锚不匹配任何字符,他们匹配一个在字符串前,后或者中间的位置。他们可以用来定位正则表达式匹配一个位置。脱字符号^匹配字符串首字符前面的位置。使用^a匹配abc,可以匹配a,但是^b不能匹配,因为b不是首字符,不能被^匹配。同样的$匹配字符串的最后一个位置,c$可以匹配abc中的c,但是a$不能匹配。
创新互联凭借在网站建设、网站推广领域领先的技术能力和多年的行业经验,为客户提供超值的营销型网站建设服务,我们始终认为:好的营销型网站就是好的业务员。我们已成功为企业单位、个人等客户提供了成都网站制作、网站设计服务,以良好的商业信誉,完善的服务及深厚的技术力量处于同行领先地位。
使用^ 和 $如果一个字符串包含多行,例如first line\nsecond line (\n是换号符),很多时候我们希望处理行而不是整个字符串。因此本教程里所有的正则表达式都有一个选项来扩展锚的语义。^可以匹配字符串的开始位置,也可以匹配每一行换行符的后面位置(\n和s之间),同样的$匹配每一行末尾的位置(最后一个e的后面),也可以匹配每一行换行符的前面(e和\n之间)。
文本编辑器EditPad Pro或者 GNU Emacs, 或者正则表达式工具 PowerGREP,脱字符^和美元符号总是匹配每一行的开始和结尾位置。这是由于这些工具设计就是用来处理整个文件的为而不是字符串。
在本教程中讨论的程序语言中,除了Ruby,你必须显示的激活扩展的功能,通常叫做多行模式。在Perl中,你需要在正则表达式后面加一个m,例如:m/^regex$/m。在.NET里,锚匹配每一行的开头和结尾时,得使用Regex.Match("string", "regex", RegexOptions.Multiline)。
零宽匹配我们都知道了,锚匹配一个位置,而不是匹配一个字符,这几意味着当一个正则表达式仅包含一个或者多个锚的时候,可以匹配0长度的字符串,这有时非常有用,有时非常讨厌。 用^\d*$来测试用户是否输入了有效的数字,这会导致空字符串也是有效数字。有时候仅仅匹配位置也是很有用的,在email中,经常用>符号和空格来表示每一行引用的消息。在VB.NET中,我们可以用 Dim Quoted as String = Regex.Replace(Original, "^", "> ", RegexOptions.Multiline)很方便的处理。我们可以使用多行模式,那样的话^匹配了引用消息的开始位置。这个正则表达式会删除匹配项,并且插入字符串"> "到起始位置,由于匹配项不包含任何字符,所以没有任何东西被删除。但是匹配项包含一个起始位置,替换的字符串正好可以插入在这里就如我们希望的那样。
正则表达式内部让我们看一下,多行模式下试图匹配^4$到749\n486\n4(\n是换号符)的时候发生了什么,正则表达式从第一个字符7开始。第一个正则表达式的匹配符是^。由于这个符号是零宽字符,引擎不会去匹配字符,但是会去匹配目前达到的字符前面的位置。^正好匹配了7前面的位置。引擎然后前进到下一个符号4。由于先前的符号是零宽的,正则表达式引擎不会前进到字符串中的下一个位子,仍然在7上,4是一个本义字符,不匹配7.没有其他的组合能匹配这个这种表达式,所以引擎重新从4之前的位置开始匹配。这个位置前面是个字符,并且这个字符也不是换行符。引擎继续继续前进到9,再次失败。下一步在\n,还是失败。再次在\n的前面的位置,是一个9,这个字符也不是换行符。
接下来,引擎达到字符串中的第二个4。^匹配了4前面的位置,因为它前面是个换行符。接下来引擎前进到下个符号,4,但不继续字符串中的位置,4匹配了4,引擎同时前进正则表达式符号和字符。现在引擎企图在8前面这个位置匹配$,这个$不能得到匹配,因为这个位置后面有字符,并且这个字符还不是一个换行符
继续,引擎必须试着再次匹配第一个符号。预先的,成功匹配第二个4,所以引擎继续匹配下一个字符8,^不能匹配。接下来的6和换行符也同样失败。
最后,引擎试着匹配第一个符号在第三个4上。成功。接下来,引擎成功匹配用4匹配4.当然正在表达式符号前进到$了,摈弃当前字符也被前进到字符串的最后一个位置了,字符串后面的空白处。没有任何符号需要字符去匹配,但是我们试着匹配一个$符号,这个强大的美元是个怪兽。他不介意这个“字符”是字符串后面的空白。事实上,这个美元符号检查当前字符,它必须是个换行符或者字符串后面的空白,$匹配当前字符前面的位置。所以美元符号匹配成功,就是最后一个4.
程序员注意了正则表达式诸如$,可以匹配字符串后面的位置,如果你查询引擎询问字符的位置,它会告诉你字符串的长度(如果字符串索引是基于0的话),或者length+1(如果字符串索引是基于1的话,这取决于 你的编程语言),如果你询问因为匹配的长度。会得到0.