正则表达式的常规语法,python 和 scala 的基本实现
常用符号
- 句点
.:通配符,用于匹配一个字符 []:限定匹配():分组符,它会将()中匹配的内容保存起来,可以对其进行访问|:或匹配$:匹配行结束符,即以什么结尾行^:匹配行开始符,即以什么开始行*:匹配 0 至多个字符+:匹配 1 次或多次?:匹配 0 次或 1 次{n}:匹配 n 次{n,}:至少匹配 n 次{n,m}:至少匹配 n 次,最多匹配 m 次\:转义符
限定匹配 []
[a-z]:条件限制在小写 a to z 范围中一个字符[A-Z]: 条件限制在大写 A to Z 范围中一个字符[a-zA-Z]:条件限制在小写 a to z 或大写 A to Z 范围中一个字符[0-9]:条件限制在小写 0 to 9 范围中一个字符[0-9a-z]:条件限制在小写 0 to 9 或 a to z 范围中一个字符[0-9[a-z]]:条件限制在小写 0 to 9 或 a to z 范围中一个字符(交集)^符号在限定匹配[]中有另外的含义,即取反操作[^a-z]:限制在非小写 a to z 范围中一个字符[^A-Z]:件限制在非大写 A to Z 范围中一个字符[^a-zA-Z]:件限制在非小写 a to z 或大写 A to Z 范围中一个字符[^0-9]:限制在非小写 0 to 9 范围中一个字符[^0-9a-z]:限制在非小写 0 to 9 或 a to z 范围中一个字符
转义字符
\:反斜杠\t:间隔('/u0009')\n:换行('/u000A')\r:回车('/u000D')\d:数字[0-9]\D:非数字[^0-9]\s:空白符号[/t/n/x0B/f/r]\S:非空白符号[^/t/n/x0B/f/r]\w:单独字符[a-zA-Z_0-9]\W:非单独字符[^a-zA-Z_0-9]\f:换页符\e:Escape\b:一个单词的边界\B:一个非单词的边界\G:前一个匹配的结束
简单示例
scala
object RegexMatch {
def main(args: Array[String]): Unit = {
matchMail("old.echo@gamil.com")
matchURL("http://oldecho.github.io")
matchPhoneNumber("813740879427dfkh8613740879427")
matchIP("127.0.0.1")
}
def matchMail(mail: String): Unit = {
val sparkRegex = "^[\\w-]+(\\.[\\w-]+)*@[\\w]+(\\.[\\w-]+)+$".r
println(sparkRegex.findAllIn(mail).getClass)
println(sparkRegex.findAllIn(mail).getClass.getSimpleName)
for(matchString <- sparkRegex.findAllIn(mail))
println(matchString)
}
def matchURL(url: String): Unit = {
val sparkRegex="^[a-zA-Z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\s*)?$".r
for(matchString <- sparkRegex.findAllIn(url))
println(matchString)
}
def matchPhoneNumber(pnum: String): Unit = {
val sparkRegex="(86)*0*13\\d{9}".r
for(matchString <- sparkRegex.findAllIn(pnum))
println(matchString)
}
def matchIP(ip: String): Unit = {
val sparkRegex="(\\d+)\\.(\\d+)\\.(\\d+)\\.(\\d+)".r
for(matchString <- sparkRegex.findAllIn(ip))
println(matchString)
}
}
// 输出:
// class scala.util.matching.Regex$MatchIterator
// MatchIterator
// oldechochuan@gamil.com
// http://oldecho.github.io
// 13740879427
// 8613740879427
// 127.0.0.1
python 3
# -*- coding: utf-8 -*-
import re
def match_mail(mail):
regex = re.compile('^[\w-]+(\.[\w-]+)*@[\w]+(\.[\w-]+)+$', re.S)
mail_in = regex.search(mail)
print(type(mail_in))
if mail_in is not None:
print(mail_in.group(0))
if __name__ == '__main__':
match_mail('old.echo@gamil.com')
# 输出:
# <class '_sre.SRE_Match'>
# old.echo@gamil.com