正则表达式入门教程-连载(5)-字符串或者行的开始和结束

简介:

至此,已经谈论了本义字符和字符集。锚不同于这两种。锚不匹配任何字符,他们匹配一个在字符串前,后或者中间的位置。他们可以用来定位正则表达式匹配一个位置。脱字符号^匹配字符串首字符前面的位置。使用^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.












本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/716996 ,如需转载请自行联系原作者


相关文章
|
6月前
|
JavaScript 前端开发 Java
正则表达式深度解析:匹配任意字符串
【4月更文挑战第1天】
3268 0
|
6月前
|
JavaScript 前端开发
JavaScript随手笔记 --- 用正则表达式匹配字符串是否为运算公式
JavaScript随手笔记 --- 用正则表达式匹配字符串是否为运算公式
|
6月前
|
JavaScript 前端开发
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
用JavaScript正则表达式匹配对应字符串高亮显示,并过滤掉空格、<、>等HTML节点符号
|
6月前
|
算法 测试技术 C#
【动态规划】【字符串】C++算法:正则表达式匹配
【动态规划】【字符串】C++算法:正则表达式匹配
|
Python
133 python高级 - 正则表达式(原始字符串)
133 python高级 - 正则表达式(原始字符串)
48 0
|
程序员
用正则表达式判断字符串形式正误(例:判断电话号码属地是否为中国大陆)
用正则表达式判断字符串形式正误(例:判断电话号码属地是否为中国大陆)
97 0
|
1月前
|
JavaScript 前端开发 Java
如何使用这个正则表达式来验证一个字符串是否符合特定的格式要求?
如何使用这个正则表达式来验证一个字符串是否符合特定的格式要求?
|
1月前
|
Java API 索引
U4字符串以及正则表达式
【10月更文挑战第19天】在 Java 中,字符串是重要数据类型,支持多种操作如长度获取、字符访问、子串提取等。正则表达式提供强大的模式匹配和文本处理功能,通过 `Pattern` 和 `Matcher` 类实现。示例代码展示了如何使用正则表达式匹配单词字符。常用语法包括字符类、数量词、边界匹配和分组。
|
2月前
|
JavaScript 前端开发 Java
使用这个正则表达式来验证一个字符串是否符合特定的格式要求
使用这个正则表达式来验证一个字符串是否符合特定的格式要求
133 5
|
2月前
|
前端开发 C#
C# 一分钟浅谈:字符串操作与正则表达式
本文详细介绍C#中的字符串操作与正则表达式应用,涵盖字符串拼接、分割、查找及替换等基础操作,并通过实例讲解正则表达式的模式匹配、文本替换与分组捕获技巧。同时,文章还探讨了性能优化、复杂度管理和安全性等问题及解决策略,助你提升编程效率,应对实际开发挑战。
76 0