- ECMAscript正则表达式语言的一些特性
子表达式的索引从1开始。
在fmt中用$后跟子表达式的索引号来标识一个特定的子表达式
-
{d}表示单个数字而{d}{n}则表示一个n个数字的序列。(如,{d}{3}匹配三个数字的序列)
-
在方括号中的字符集合表示匹配这些字符串中任意一个(如,[-. ]匹配一个短横线或一个点或一个空格)
-
后接‘?’的组件是可选的( 如, { d } { 3 } [-. ] ? { d} { 4 } 匹配这样的序列: 开始是三个数字, 后接一个可选的短横线或点或空格, 然后是四个数字。 此模式可以匹配 555-0132 或 555.0132 或 555 0132 或 5550132。 )
-
类似C++,在模式中每次出现的的地方需要转义因此需要使用
eg.
// 整个正则表达式包含七个子表达式: ( ddd ) 分隔符 ddd 分隔符 dddd
// 子表达式 1、 3、 4 和 6 是可选的; 2、 5 和 7 保存号码
string phone = "(\()?(\d{3})(\))?([-.])?(\d{3})([-.])?(\d{4})"
-
"(()?表示区号部分可选的左括号
-
(d{3})表示区号
-
())?表示区号部分可选的右括号
-
([-.])?表示区号部分可选的分隔符
-
(d{3})表示号码的下三位
-
([-.])?表示可选的分隔符
-
(d{4})表示号码的最后四位数字
string phone = "(\()?(\d{3})(\))?([-. ])?(\d{3})([-. ]?)(\d{4})";
regex r(phone);
string s;
while (getline(cin, s)) {
for (sregex_iterator it(s.begin(), s.end(), r), end_it; it != end_it; ++it) {
if (valid(*it)) { // valid为自定义函数,检查通过匹配后的号码是否合法
cout << "valid: " << it->str() << endl;
} else {
cout << "not valid: " << it->str() << endl;
}
}
}



