位置匹配

在某些场合,只需要对某段文本的特定位置进行匹配,这就引出位置匹配的概念.

  • 单词边界

第一种边界(也是最常用的边界)是由限定字符\b指定的单词边界.显而易见,\b用来匹配一个单词的开始或结尾.

文本
The cat scattered his food all over the room.
正则表达式
bcatb
结果
The cat scattered his food all over the room.
分析

单词cat的前后都有一个空格,而这将与模式bcatb相匹配.单词scatteered的字符序列cat不能与这个模式相匹配,因为它前面有一个字符s,后面一个字符t.


文本
The captain wore his cap and cape proudly
正则表达式
bcap
结果
The captain wore his cap and cape proudly
分析
模式\bcap将匹配以字符序列cap开头的任何一个单词,这里共找到3个匹配.其中2个以字符序列cap开头的其他单词而不是cap本身.


文本
The captain wore his cap and cape proudly recap
正则表达式
capb
结果
The captain wore his cap and cape proudly recap
分析
capb 找到了本身,以及以cap开头的单词。

  • 字符串边界
    单词边界可以用来与单词有关的位置匹配(单词的开头,单词的借宿,整个单词等).字符串边界有何类似的用途,只不过是用来进行与字符串有关的位置匹配而已(字符串的开头、字符串的结束、整个字符串等)用来定义字符串边界的元字符有两个:一个是用来定义字符串开头的^,另一个是用来定义字符串结尾的$.

为了演示字符串边界的用法,下面准备了一个例子.合法的XML文本必须以<?xml>标签开头并有一些其他属性(比如一个版本号,如<?xml version="1.0" ?>)
文本
<?xml version="1.0" encoding="UTF-8" ?>
正则表达式
<?xml.*?>
结果

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

除了位置上的差异,$的用法与^完全一样.模式^.*$是一个在语法上完全正确的正则表达式;它几乎总能找到一个匹配,但没有任何实际用途.


  • 分行匹配模式

有许多正则表达式都支持使用一些特殊的元字符去改变一些元字符行为的做法,用来启用分行匹配模式(multiline mode)的(?m)记号就是一个能够改变其他元字符行为的元字符序列.分行匹配模式将使得正则表达式引擎把行分隔符当作一个字符串分隔符来对待.在分行匹配模式下,^不仅匹配正常的字符串开头,害将匹配行分隔符(换行符)后面的开始位置(这个位置是不可见的);类似地,$不仅匹配正常的字符串结尾,还将匹配分隔符(换行符)后面的结束位置.在使用时,(?m)必须出现在整个模式的最前面.


文本
// Make sure not empty
// Init
// Done
正则表达式

(?m)^\s*//.*$

结果

  // Make sure not empty
  // Init
  // Done

分析

^s//.$将匹配一个字符串的开始,然后是任意多个空白字符,再后面是//,再往后是任意文本,最后是一个字符的结束.不过,这个模式只能找出第一条注释(并认为这条注释将一直延续到文件的末尾,因为*是一个"贪婪型"元字符).加上(?m)前缀之后,(?m)^\s*//.*$将把换行符视为一个字符串分隔符,这样就可以把每一行注释都匹配出来了.


小结

正则表达式不仅可以用来匹配任意长度的文本块,还可以用来匹配出现在字符串中特定位置的文本.\b用来指定一个单词边界(\B刚好相反).^$用来指定字符串边界(字符串的开头和字符串的结束).如果与(?m)配合使用,^$还将匹配在一个换行符处开头或结束的字符串(此时,换行符将被视为一个字符串分隔符)

最后修改:2021 年 12 月 14 日
如果觉得我的文章对你有用,请随意赞赏