正则表达式的使用

简单了解了正则表达式在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;
Lei Yang
Lei Yang
PhD candidate

My research interests include visual speech recognition and semantics segmentation.