正则表达式的常规语法,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