一、匹配一个或多个字符
使用单个元字符'.'或者其他元字符如'\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 ctcaat中的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被匹配出来。