正则表达式是含有一些具有特殊意义字符的字符串,这些特殊的字符称为正则表达式。
常用正则表达参照表:
元字符 | 正则表达式的写法 | 意义 |
.(点) | .(点) | 代表任何一个字符 |
\d | \\d | 代表0到9的任何一个数字 |
\D | \\D | 代表任意一个非数字字符 |
\s | \\s | 代表任意一个空格类字符(例如:’\t’ ,‘\n’, ‘\x0B’ ,‘\f’,’\r’ ) |
\S | \\S | 代表非空格类字符 |
\w | \\w | 代表可用于标识符的字符(不包括美元符号) |
\W | \\W | 代表不能用于标识的字符 |
\p{Lower} | \\p{Lower} | 小写字母[a-z] |
\p{Upper} | \\p{UPPer} | 大写字母[A-Z] |
\p{ASCII} | \\p{ASCII} | ASCII码字符 |
\p{Alpha} | \\p{Alpha} | 字母 |
\p{Digit} | \\p{Dight} | 数字字符[0-9] |
\p{Alunm} | \\p{Alunm} | 字符或数字 |
\p{Punct} | \\p{Punct} | 标点符号(英文各种标点) |
\P{Graph} | \\p{Graph} | 可视字符:\p{Alunm},\p{Punct} |
\P{Print} | \\p{Paint} | 可打印字符:\p{Graph} |
\P{Blank} | \\P{Blank} | 空格或制表符[\t] |
\P{Cntrl} | \\P{Cntrl} | 控制字符:[\x00-\xlF\x7F] |
在正则表达式中,可以使用方括号括起来若干字符来表示一个元字符,该字符代表方括号中任何一个字符。
例如:
[012]A可以和0A,1A,2A匹配。
方括号元字符的意义如下:
[abc]:代表a、b、c中的任何一个。
[^abc]:代表除a、b、c中的任何一个。
[a-zA-Z]:代表英文字目中的最后一个。
[a-d]:代表a到d中的任何一个。
中括号中允许嵌套中括号,可以进行并、交、差运算。
[a-d[m-p]]:代表a到d,或m到p中的任何一个的字符(并)。
[a-z&&[def]]:代表d、e、f中的任何一个(交)。
[a-f&&[^bc]]:代表a、d、e、f中的一个(差)。
注:由于“.”表示任何一个字符,所以在正则表达式中如果想使用普通意义的点字符。必须使用[.]或者用\56表示普通意义的点字符。
在正则表达式中可以使用界限定符。例如界定修饰符“?”。如果x代表正则表达式中的一个元字符或普通字符,那么“x?”代表x表示出现0次或1次。
限定符:
待限定符的模式 | 意义 |
X? | X出现0次或1次 |
X* | X出现0次或多次 |
X+ | X出现一次或多次 |
X{n} | X恰好出现n次 |
X{n,} | X至少出现n次 |
X{n,m} | X出现n到m次 |
XY | X与Y |
X|Y | X或Y |
使用示例:
C++
需要包含头文件:
#include<regex>
regex_match:
判断一个正则表达式(参数re)是否匹配整个字符序列str,它主要用于验证文本,注意,这个正则表达式必须匹配被分析串的全部,否则返回false;如果整个序列被成功匹配,返回true
regex_search:
类似于regex_match,但它不要求整个字符序列完全匹配,可以用regex_search来查找输入中的一个子序列,该子序列匹配正则表达式re
regex_replace:
在整个字符序列中查找正则表达式re的所有匹配,这个算法每次成功匹配后,就根据参数fmt对匹配字符串进行替换。
"[\\+\\-]?[0-9]*(\\.[0-9]+)?([Ee][\\+\\-]?[0-9]+)?"
\\为转译。
[\\+\\-]?:有一个或者没有+或-(有负数和正数,但正号可以忽略不写)
[0-9]*:有0个或多个0-9
\\.[0-9]+:有点且至少有一个数字(小数点后必须跟数字)
(\\.[0-9]+)?:可以没有小数点,但有小数点时后面至少有一个数字。
[Ee][\\+\\-]?:E、e后可以有+、-或没有。
[Ee][\\+\\-]?[0-9]+:E、e后必须有数字。
([Ee][\\+\\-]?[0-9]+)?:可以没有
程序示例:
#include<iostream>
#include<regex>
#include<string>
using namespace std;
bool isNumeric(char* str1)
{
//构造符合规定的正则表达式
regex reg("[\\+\\-]?[0-9]*(\\.[0-9]+)?([Ee][\\+\\-]?[0-9]+)?");
smatch r;
string str = string(str1);
return regex_match(str,r,reg);
}
int main()
{
//+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是
cout << isNumeric("123.45e+6") << endl;
cout << isNumeric("5e2") << endl;
cout << isNumeric("-123") << endl;
cout << isNumeric("+100") << endl;
cout << isNumeric("-1E-16") << endl;
cout << isNumeric("-.123") << endl;
cout << "------------------------------------------------" << endl;
cout << isNumeric("12e") << endl;
cout << isNumeric("1a3.14") << endl;
cout << isNumeric("1.2.3") << endl;
cout << isNumeric("12e+4.3") << endl;
cout << isNumeric("+-5") << endl;
return 0;
}