正则表达式位置匹配,正则表达式是匹配模式,要么匹配字符,要么匹配位置,本文介绍单词边界匹配\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*$
。
^ 是几个有着多种用途的元字符之一。只有当它出现在一个字符集合里(被放在 [ 和 ] 之间)并紧跟在左方括号 [ 的后面时,它才能发挥 “求非” 作用。如果是在一个字符集合的外面并位于一个模式的开头,^ 将匹配字符串的开头。
极客教程相关文章推荐,欢迎阅读!
正则表达式重复匹配
正则表达式排除字符
正则表达式匹配多个字符中的一个
正则表达式匹配特殊字符
正则表达式 – 元字符