本文解决四个问题
- 正则表达式能够干什么?
- 正则表达式怎么用?
- 有哪些常用的正则实际例子?
- 正则在Python、Swift、Kotlin中的使用方法?
正则表达式能够干什么?
- 数据验证
- 字符串是否具有固定的格式
- 例如: 身份证号、手机号、邮箱、信用卡、BTC地址等
- 文本替换
- 识别出字符串内的特定文本, 删除或替换这些文本.
- 例如: 将html中的标签全部去除
- 提取子字符串
- 识别出符合特定文本, 并提取出来
- 获取网页中的所有URL、手机号、邮箱
正则表达式怎么用?
- 字符类型
- 普通字符
- 非打印字符
- 特殊字符
- 特殊
- () 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
- . 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。
- [ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
- \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
- | 指明两项之间的一个选择。要匹配 |,请使用 \ |。
- 限定符
- 含义: 指定正则表达式的一个给定组件必须要出现多少次才能满足匹配
*
匹配前面的子表达式零次或多次。+
匹配前面的子表达式一次或多次。?
匹配前面的子表达式零次或一次。{n}
n是一个非负整数。匹配确定的 n 次。{n,}
n是一个非负整数。至少匹配n 次。{n,m}
m和n均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。- ⚠️
*、+
限定符都是贪婪的, 在它们的后面加上一个?就可以实现非贪婪或最小匹配。
- 定位符
- 含义: 定位符使您能够将正则表达式固定到行首或行尾。
- ^ 匹配输入字符串开始的位置。
- $ 匹配输入字符串结尾的位置。
- \b 匹配一个单词边界,即字与空格间的位置。
- \B 非单词边界匹配。
- 特殊
- 普通字符
- 运算符优先级
- \ 转义符
- (), (?:), (?=), [] 圆括号和方括号
- *, +, ?, {n}, {n,}, {n,m} 限定符
- ^, $, \任何元字符、任何字符 定位点和序列
- | 替换,”或”操作
- 规则
- 基本模式匹配
- ^ $
- 字符簇
- [[:alpha:]] 任何字母
- [[:digit:]] 任何数字
- [[:alnum:]] 任何字母和数字
- [[:space:]] 任何空白字符
- [[:upper:]] 任何大写字母
- [[:lower:]] 任何小写字母
- [[:punct:]] 任何标点符号
- [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]
- 确定重复出现
- 特殊字符 * 与 {0,} 是相等的,它们都代表着 0 个或多个前面的内容 。
- 所有包含一个以上的字母、数字或下划线的字符串
^[a-zA-Z0-9_]{1,}$
- 所有的正整数
^[1-9][0-9]{0,}$
- 所有的整数
^\-{0,1}[0-9]{1,}$
- 所有的浮点数
^[-]?[0-9]+\.?[0-9]+$
- 基本模式匹配
3. 有哪些常用的正则实际例子?
- 匹配双字节汉字:
[^u4e00-u9fa5]
- 匹配中文字符
[u4e00-u9fa5]
- 匹配HTML标记:
<(S*?)[^>]*>.*?|<.*? />
- 匹配HTML标签:
</?[a-zA-Z]+[^><]*>
- 匹配空白行:
ns*r
- 匹配首尾空白字符
^s*|s*$
- 匹配Email地址
w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
- 匹配网址URL的正则表达式:
http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
- 匹配国内电话号码:
[0-9]{3}-[0-9]{8}|[0-9]{4}-[0-9]{7}
- 匹配ip地址:
[1-2]?[0-9]{1,2}.[1-2]?[0-9]{1,2}.[1-2]?[0-9]{1,2}.[1-2]?[0-9]{1,2}
- 匹配26个英文字母字符串
- ^[A-Za-z]+$
- 验证一年的12个月
^(0?[1-9]|1[0-2])$
- 验证一个月的31天:
^((0?[1-9])|((1|2)[0-9])|30|31)$
4. Python、Swift、Kotlin中的使用
- Python:
import re
re.match( r’</?[a-zA-Z]+[^><]*>’, line, re.M | re.I)
re.findall(“</?[a-zA-Z]+[^><]*>”, “123444-1222”)
re.compile(“</?[a-zA-Z]+[^><]*>”).sub(‘replace string’, “origin string”)
- Kotlin:
Regex(“</?[a-zA-Z]+[^><]*>”).matches(“string”)
Regex(“</?[a-zA-Z]+[^><]*>”).findAll(“<p></p>”)
Regex(“</?[a-zA-Z]+[^><]*>”).replace(“new string”, “replace string”)
- Swift:
var string = “origin string”
let pattern = “</?[a-zA-Z]+[^><]*>”
let regex = try? NSRegularExpression(pattern: pattern, options: [])
if let results = regex?.matches(in: acount, options: [], range: NSRange(location: 0, length: acount.count)), results.count != 0 {
for result in results{
let string = (acount as NSString).substring(with: result.range)
}
}
正则不难很有用, 能积累点最好.