正则表达式的使用
简单了解了正则表达式在python和C++中的使用方法
基本元素和规则
符号 | 含义 |
---|---|
^ | 句首 |
$ | 句尾 |
. | 匹配单个字符 |
* | 多次出现($\geq0$) |
+ | 多次出现($\geq1$) |
? | 零次或一次出现 |
{n,m} | 表示匹配n-m次 |
\ | 匹配转义字符 |
() | 匹配子串并获取 |
| | 匹配两项之间的一个 |
/ / | 表示pattern匹配 |
[] | 表示多个可选项 其中的^表示非 |
非打印字符的匹配
字符 | 含义 |
---|---|
\cx | 控制字符control+x,这里的x必须是A-Z |
\f | 换页符号 |
\n | 换行符 |
\r | 回车键 |
\s | 空白字符 类似[\f\n\r\t\v] |
\S | 非空白字符 |
\t | 制表符 |
\v | 垂直制表符 |
定位符
符号 | 含义 |
---|---|
\b | 单词边界(单词和空格交界处) |
\B | 非单词边界 |
常用的匹配
匹配 | 含义 |
---|---|
\d | 匹配一个数字 相当于[0-9] |
\w | 匹配一个字符 相当于[A-Za-z0-9_] |
预查
符号 | 含义 |
---|---|
(?:pattern) | 匹配但是不获取(缓存) |
a(?=pattern) | 匹配pattern之前的a |
a(?!pattern) | 匹配后面没有pattern的a |
(?<=pattern)b | 匹配前面有pattern的b |
(?<!pattern)b | 匹配前面没有pattern的b |
在各种环境中使用正则表达式
C++中使用正则表达式REGEX
// 引入头文件
#include<regex>
// 定义一个正则表达式
std::regex pattern("([0-9]+)");
// 声明匹配结果变量,结果变量要和字符串形式相对应
std::match_results<const char*> cResult;
// 简化定义std::cmatch
std::match_results<std::string::const_iterator> sResult;
// 简化定义std::smatch
// 定义待匹配的字符串
char cStr[] = "hello";
std::string sStr = "123abc";
// 进行匹配
// regex_match(string, result, pattern)
// 其中string可以是迭代器指明的区间
// result可以省略
bool cValid = regex_match(cStr, cResult, pattern);
bool sValid = regex_match(sStr, sResult, pattern);
// 返回匹配结果
cResult.size(); //返回匹配的子串个数
for(int i = 0; i < cResult.size();i++){
cResult[i];
cResult.str(i); //显示匹配的部分子串
}
/*
* 同样支持
* regex_search(string, result, pattern)
* regex_replace(string, pattern, substr)
* 可以用$1 $2 %3指括号匹配到的子串
*/
Java中正则表达式的类库
import java.util.regex.*
// 实际上包含了Pattern、Matcher、PatternSyntaxException三个类
javascript中使用正则表达式
var re = new RegExp(pattern, modifiers);
python中使用正则表达式
# 引用正则表达式包
import re
正则表达式标志位
标志 | 含义 |
---|---|
re.I | 忽略大小写 |
re.M | 多行模式 |
re.L | 特殊字符集依赖于当前环境 |
re.S | 任意字符 |
re.U | 特殊字符依赖于Unicode |
re.X | 忽略空格和注释 |
匹配函数:match
# 匹配函数
obj = re.match(pattern, string, flags=0)
# 返回一个re匹配对象
# 匹配失败返回None
obj.span() # 显示匹配到的子串的位置
obj.groups() # 显示括号匹配到的子串
obj.group(num=0) # 显示匹配到的整个字符串
obj.start() # 显示匹配到的子串的起始位置
obj.end() # 显示匹配到的子串的结束位置
# 可以使用?P<name>为子串命名并用group取出
pattern=":(?P<port>[0-9]+)"
obj.group("port")
查找函数:research
re.search(pattern, string, flags=0)
区别:
match()从头开始匹配,不满足返回None
search()匹配整个字符串直到找到一个匹配
findall()匹配所有
finditer()返回迭代器(list?)
split()按子串分割原字符串
替换函数:sub
# 查找并替换
re.sub(pattern, repl, string, count=0, flags=0)
# 将满足pattern的部分换成repl,count指明替换的次数
注意:
这里的repl可以是一个函数,函数参数为matched
matched匹配对象,可以使用group取出匹配到的子串并做相应的处理
编译函数:compile
将pattern编译为一个对象,具有match和search的成员函数
其他环境
C#中正则表达式的类库
using System.Text.RegularExpressions;