正则表达式(三)-- 重复匹配

时间:2021-03-06 05:34:54

一、匹配一个或多个字符

使用单个元字符'.'或者其他元字符如'\d'只能匹配单个的字符,而有时我们需要匹配同一字符或者字符集合的多次重复,比如要匹配的文本中有很多数字(假设没有其他字符与数字混合的情况),这些数字的位数不确定,现在需要用正则表达式将这些数字全部匹配出来,仅仅使用单个的'\d'可以匹配出一位数,两个'\d\d'可以匹配出一个两位数,但文本中的数字位数不确定,所以我们不知道究竟该用多少个'\d',在这种情况下就需要使用另一个元字符'+'。在上面的例子中只需要简单的在'\d'后面添加一个+即可,即'\d+',就可以匹配出文本中的全部数字。'+'匹配一个字符或字符集合多次(大于等于1次)连续出现的情况。例如a+,将匹配一个或多个连续出现的a,\d+匹配一个或多个连续的数字。需要注意的是给一个字符集合加上'+'时,'+'需要在字符集合的外面,而不能在里面,如[0-9]+匹配一个或多个连续出现的数字,而[0-9+]则匹配一个数字或者一个‘+’,当在字符集合里时,元字符'+'将被解释为普通字符,不需要被转义,但转义也是可以的。

例子:

文本:1 12 123 4567 123456789 abc

正则表达式:\d+

结果:1 12 123 4567 123456789 abc

二、匹配零个或多个字符

+匹配一个或多个字符,不匹配零个字符,有时我们想要匹配一个可有可无的字符,这时就需要使用另外一个元字符'*','*'的用法与'+'完全一样,只需要把'*'放在一个字符或字符集合的后面即可,只是'*'的含义是匹配零个或多个连续出现的字符。

例子:

文本:cat caat ct

正则表达式:ca*t

结果:cat caat ct


文本:cat caat ct

正则表达式:ca+t

结果:cat caat ct

三、匹配零个或一个字符

有时我们想要一个字符是可有可无的,没有这个字符的时候,此字符的出现次数为零,但有这个字符的时候我们不希望此字符连续多次出现,而希望此字符只出现一次,在这种情况下,就需要使用元字符'?','?'只匹配一个字符或字符集合的零次或一次出现。

例子:

文本:cat caat ct

正则表达式:ca?t

结果: cat caat ct

caat中的a出现了两次,所以不被匹配。

四、设置精确的重复匹配次数

使用'+','*',?'只会匹配一个字符或字符集合的零次,一次,或多次连续匹配。假如我们只想找文本里的所有六位数(假设文本中数字最多为六位,有其他字符与数字混合的情况),这时使用'+','*',?'就不能解决问题了,所以我们需要为连续匹配设置一个精确的值,即6。在正则表达式中实现起来很简单,只需要把6写在元字符'{'和元字符'}'之间即可,\d{6},就匹配出了文本中的所有六位数。

例子:

文本:12 123456 78 ab

正则表达式:\d{6}

结果:12 123456 78 ab

五、为重复匹配次数设置区间

有时我们不仅想找出来文本中六位数,还想找出来三位数、四位数、五位数,这时可以为'{}'设置一个重复匹配的区间,如{3,6}含义为最少匹配3次,最多匹配6次,3为最小匹配 次数,6位最大匹配次数,元字符'?'就等价于{0,1}。

例子:

文本:12 123 1234 12345 123456

正则表达式:\d{3,6}

结果:12 123 1234 12345 123456

六、设置最小匹配次数

例子:

文本:12 123 1234 12345 123456

正则表达式:\d{5,}

结果:12 123 1234 12345 123456

省略最大匹配次数,设置最小匹配次数为5,所以5位数12345和6位数123456被匹配出来。