C++ 中的正则表达式 Regex
2012-08-06 18:39
441 查看
注:下文所有内容仅仅适用于C++ 2011的新标准,相关编译环境为VS2010。
首先简单列举一下Regex表达式中的一些语法元素:
下面列举一下Regex表达式中的一些量词:
在Regex中,量词默认是采用“贪心”原则。如要采用“非贪心”原则,可以在量词后面跟“?”。
<b>.*</b>匹配<b>x</b>y<b>z</b>
<b>.*?</b>匹配<b>x</b>y<b>z</b>
在Regex中,括号“()”用来确定优先级,以及确定Capture(捕获)。通常情况下,Capture(捕获)是无害的,但如果我们不希望Capture发生,可以使用以下语法:
(?:whatever)
以上是Regex的语法的简单回顾。接着,我们来看一下C++中如何应用Regex相关库。
在C++中对应的Regex的Header File是<regex>。
在Regex中真正的类型名是basic_regex,regex仅仅是该类型模板对于char的一个类型别名。以下是一些常用的类型别名:
下面让我们来看一下match_results和sub_match的区别。
match_results表示对一个给定Regex表达式的匹配字符串,以及其所有的包含Capture。
sub_match表示对于一个Regex表达式中,一个Capture的匹配。
在Regex中,有3个常用函数,分别是regex_match(),regex_search()及regex_replace()。
执行用例:
8x10
> Yes
1920x1200
> Yes
3.14x137
> No
以下是一个关于Capture的例子:
执行用例:
1920x1200
> 1920 by 1200
执行用例:
Stephan T. Lavavej
> *** Lavavej, Stephan T.
Stephan Thomas Lavavej
> *** Lavavej, Stephan Thomas
Stephan Lavavej
> *** Lavavej, Stephan
这里在Format字符串中引用了匹配中的Capture,以下是一个详表:
Regex: ([A-Z]+)-([0-9]+)
String: 2161-NCC-1701-D
补充一下关于 正向预查 与 负向预查 的语法:
以下是一个例子:
Regex: ([1-9]\d*|0)(\.\d+)?|0[xX][0-9a-zA-Z]
对于上述模式,在匹配十六进制数时会遇到问题。“0x1”中的“0”先会被匹配,之后的“x”便无法被成功识别。在这里便可以使用 负向预查 来消除上述错误。以下是可用版本。
Regex: ([1-9]\d*|0(?![xX]))(\.\d+)?|0[xX][0-9a-zA-Z]
更改之后,在0之后不希望出现x或X。如此,便可以避免“0x1”中的“0”被前一个模式“吃”掉的情况。
以下Link是一个关于Regex语法(ECMAScript Grammar)的参考。
http://cplusplus.com/reference/std/regex/ECMAScript/
首先简单列举一下Regex表达式中的一些语法元素:
. | 通配符,可匹配任何字符。 |
[] | 匹配中括号中的任何字符。 |
\d | 匹配所有数字字符。即:[0-9] |
\D | 匹配所有非数字字符。即:[^0-9] |
\s | 匹配所有空字符。 |
\w | 匹配所有字母、数字及下划线。 |
* | 匹配0个或多个。 |
+ | 匹配1个或多个。 |
? | 匹配0个或1个。 |
{3} | 匹配3个。 |
{3,} | 匹配3个及以上。 |
{3,5} | 匹配3至5个。 |
<b>.*</b>匹配<b>x</b>y<b>z</b>
<b>.*?</b>匹配<b>x</b>y<b>z</b>
在Regex中,括号“()”用来确定优先级,以及确定Capture(捕获)。通常情况下,Capture(捕获)是无害的,但如果我们不希望Capture发生,可以使用以下语法:
(?:whatever)
以上是Regex的语法的简单回顾。接着,我们来看一下C++中如何应用Regex相关库。
在C++中对应的Regex的Header File是<regex>。
在Regex中真正的类型名是basic_regex,regex仅仅是该类型模板对于char的一个类型别名。以下是一些常用的类型别名:
regex | basic_regex<char> |
cmatch | match_results<const char *> |
smatch | match_results<string::const_iterator> |
csub_match | sub_match<const char *> |
ssub_match | sub_match<string::const_iterator> |
match_results表示对一个给定Regex表达式的匹配字符串,以及其所有的包含Capture。
sub_match表示对于一个Regex表达式中,一个Capture的匹配。
在Regex中,有3个常用函数,分别是regex_match(),regex_search()及regex_replace()。
// Sample Code for 'regex_match()' #include<iostream> #include<regex> using namespace std; using namespace std::tr1; int _tmain(int argc, _TCHAR* argv[]) { regex r("[1-9]\\d*x[1-9]\\d*"); for (string s; getline(cin, s); ) { cout << (regex_match(s, r) ? "Yes" : "No") << endl; } }
执行用例:
8x10
> Yes
1920x1200
> Yes
3.14x137
> No
以下是一个关于Capture的例子:
// Sample Code for 'regex_match()' - (2) const regex r("([1-9]\\d*)x([1-9]\\d*)"); for (string s; getline(cin, s); ) { smatch m; if (regex_match(s, m, r)) { cout << m[1] << " by " << m[2] << endl; // 第0个Capture是整个Regex的匹配 } }
执行用例:
1920x1200
> 1920 by 1200
// Sample Code for 'regex_replace()' const regex r("(\\w+)( \\w+\\.?)? (\\w+)"); const string fmt("$3, $1$2"); for (string s; getline(cin, s); ) { cout << "*** " << regex_replace(s, r, fmt) << endl; }
执行用例:
Stephan T. Lavavej
> *** Lavavej, Stephan T.
Stephan Thomas Lavavej
> *** Lavavej, Stephan Thomas
Stephan Lavavej
> *** Lavavej, Stephan
这里在Format字符串中引用了匹配中的Capture,以下是一个详表:
Regex: ([A-Z]+)-([0-9]+)
String: 2161-NCC-1701-D
$1 | 第1个Capture | NCC |
$2 | 第2个Capture | 1701 |
$& | 整个Regex的匹配 | NCC-1701 |
$` | 这个Regex的前缀 | 2161- |
$' | 这个Regex的后缀 | -D |
$$ | 字符“$” | $ |
(?=SubPattern) | 正向预查 | 在这个预查模式之后的字符串必须符合该预查模式,但其不消耗字符。 |
(?!SubPattern) | 负向预查 | 在这个预查模式之后的字符串必须不符合该预查模式,但其不消耗字符。 |
Regex: ([1-9]\d*|0)(\.\d+)?|0[xX][0-9a-zA-Z]
对于上述模式,在匹配十六进制数时会遇到问题。“0x1”中的“0”先会被匹配,之后的“x”便无法被成功识别。在这里便可以使用 负向预查 来消除上述错误。以下是可用版本。
Regex: ([1-9]\d*|0(?![xX]))(\.\d+)?|0[xX][0-9a-zA-Z]
更改之后,在0之后不希望出现x或X。如此,便可以避免“0x1”中的“0”被前一个模式“吃”掉的情况。
以下Link是一个关于Regex语法(ECMAScript Grammar)的参考。
http://cplusplus.com/reference/std/regex/ECMAScript/
相关文章推荐
- 初学C++正则表达式(regex)
- TPL: 一个新的C++正则表达式(regex)库
- C++正则表达式 regex
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)
- C++:Regex正则表达式
- C++:Regex正则表达式
- C++ - 正则表达式(regex) 替换(replace) 的 详解 及 代码
- 日志 c/c++ 正则表达式 regex
- C++ - 正则表达式(regex) 迭代器(iterator) 的 详解 及 代码
- C++ - 正则表达式(regex) 替换(replace) 的 详解 及 代码
- C++ 11 regex正则表达式匹配所有内容,包括空格回车换行>(.|\\r|\\n)*?
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)
- C++ - 正则表达式(regex) 迭代器(iterator) 的 详解 及 代码
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)
- TPL: 一个新的C++正则表达式(regex)库
- c++中正则表达式(regex)
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)
- C++ regex 正则表达式的使用
- C++中三种正则表达式比较(C regex,C ++regex,boost regex)