正则表达式位置匹配

正则表达式位置匹配,正则表达式是匹配模式,要么匹配字符,要么匹配位置,本文介绍单词边界匹配\b字符串边界匹配^$

什么是位置?
位置是相邻字符之间的位置。比如,下图中箭头所指的地方:
正则表达式位置匹配

单词边界

由限定符 \b 指定的单词边界,\b 用来匹配一个单词的开始或结尾。

文本:

the cat scattered his food all over the room.

执行正则表达式:\bcat\b

执行结果:
正则表达式位置匹配

在原始文本里,单词 cat 的前后都有一个空格,而这与模式 \bcat\b 想匹配(空格是用来分隔单词的字符之一)。单词 scattered 中的字符序列 cat 不能与这个模式匹配,因为它的前一个字符是 s,后一个字符是 t (这两个字符都不能与 \b 相匹配)。

\b 匹配的是一个这样的位置,这个位置位于一个能够用来构成单词的字符(字母、数字和下划线,也就是与 \w 相匹配的字符)和一个不能用来构成单词的字符(也就是与 \W 相匹配的字符)之间。

注:\w\W的用法在极客教程元字符有介绍。

如果你想要匹配一个完整的单词,就必须在你想要匹配的文本的前后都加上 \b 限定符。

\b 匹配且只匹配一个位置,不匹配任何字符。用 \bcat\b 匹配到的字符串的长度是3个字符(c、a、t),而不是5个字符。 **如果你想表明不匹配一个单词边界,请使用 \B **。

文本:

Please enter the nine-digit id as it appears on your color - coded pass-key.

执行正则表达式:\B-\B

执行结果:
正则表达式位置匹配

除了用来匹配单词边界(开头或结尾均可)的 \b,有些正则表达式实现还支持另外两个元字符: \< 只匹配单词的开头; \> 只匹配单词的结束。不过,虽然这两种元字符可以提供更细的控制,但支持它们的正则表达式引擎却并不多见。

字符串边界

字符串边界可以用来进行与字符串有关的位置匹配(字符串的开头、字符串的结束、整个字符串等)。用来定义字符串边界的元字符有两个:一个是用来定义字符串开头^ ,另一个是用来定义字符串结尾$

合法的 XML 文档都必须以 <?xml> 标签开头并有一些其他属性,用:<\?xml.*\?> 可以检查一段文本是否是一篇 XML 文档,如果文档前面有其他内容,将不是合法的 XML 文档。

文本:

This is bad, real bad!
<?xml version="1.0" encoding="UTF-8" ?>

执行正则表达式:^\s*<\?xml.*\?>

执行结果:
正则表达式位置匹配

文本:

<?xml version="1.0" encoding="UTF-8" ?>

执行正则表达式:^\s*<\?xml.*\?>

执行结果:
正则表达式位置匹配

这里,^ 匹配一个字符串的开头位置,所以 ^\s* 将匹配一个字符串的开头位置和随后的零个或多个空白字符(这解决了<?xml>标签前允许有空格、制表符、换行符等空白字符的问题)。模式 ^\s*<\?xml.*\?> 不仅能正确地匹配一个位置正确的 <?xml>标签,还能对合法的空白字符做出妥善处理。

除了位置上的差异,$ 的用法与 ^ 完全一样。比如说,在一份 Web 页面里,</html> 标签的后面不应该再有任何实际内容,而这一点可以用下面的这个模式来检查: \s*$

^ 是几个有着多种用途的元字符之一。只有当它出现在一个字符集合里(被放在 [ 和 ] 之间)并紧跟在左方括号 [ 的后面时,它才能发挥 “求非” 作用。如果是在一个字符集合的外面并位于一个模式的开头,^ 将匹配字符串的开头。

极客教程相关文章推荐,欢迎阅读!
正则表达式重复匹配
正则表达式排除字符
正则表达式匹配多个字符中的一个
正则表达式匹配特殊字符
正则表达式 – 元字符

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程