一、规则
[ ] 包含一系列字符
[^ ] 包含之外一系列字符
( ) 子表达式的开始和结束位置
{ } 匹配次数的符号
[ABCD] 将会匹配一个A或者一个B或者一个C或者一个D。
[A-D] 这跟[ABCD]所要表达的是一样的意思。
[^abc] 包含abc之外的任意字符
[0-9] 可以用\d来代替。
{m,n} 至少重复m次,最多重复n次
{m,} 至少重复m次
{,n} 最多n次,{0,n}
{n} 重复n次 {n,n}
? {0,1} 0次或者1次
+ {1,} 至少出现1次
* {0,} 不出现或出现任意次
x{1,1} 匹配一个但仅仅一个x。
x{1,5} 意味着匹配至少一个但不超过5个的x。
. 除了换行符以外的任意字符
/d [0-9] 任意一个数字 /D 所有非数字字符,大写表示相反的
/w 字母、数字、下划线、汉字 /W 所有字母、数字、下划线以外的字符
/s 任意的空白符 /S 所有非空白字符
/b 单词的开始或结尾 /B 匹配非单词边界,即左右两边都是 "/w" 范围或者左右两边都不是 "/w" 范围时的字符缝隙
/~ 字符串的开始
\n 第n个反向引用,n从1开始编号, \1 就表示前面第一个捕获到的文本
$ 字符串的结束
^ 字符串开始位置,不匹配任何字符
$ 字符串结尾位置,不匹配任何字符
//正则表达式因为出现一些特殊字符,在C/C++代码里使用时,必须进行转换。
"(\\S+)\\s*=\\s*(\\S*)" //即是:"(\S+)\s*=\s*(\S*)"
一、Qt中的应用
1、限制输入
QRegExp regEdit("(0)|([1-9][0-9]{0,1})|([1-2][0-9]{0,2})|(300)"); //0-300
ui->lineEdit->setValidator(new QRegExpValidator(regEdit));
QRegExp regExp;
regExp.setPattern("^[a-zA-Z0-9_\u4e00-\u9fa5\\w]+$"); //数字,大小写英文字母,下划线,汉字
// 非负整数(正整数 + 0)
"^/d+$"
// 正整数
"^[0-9]*[1-9][0-9]*$"
// 非正整数(负整数 + 0)
"^((-/d+)|(0+))$"
// 负整数
"^-[0-9]*[1-9][0-9]*$"
// 整数
"^-?/d+$"
// 非负浮点数(正浮点数 + 0)
"^/d+(/./d+)?$"
// 正浮点数
"^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$"
// 非正浮点数(负浮点数 + 0)
"^((-/d+(/./d+)?)|(0+(/.0+)?))$"
// 负浮点数
"^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$"
// 浮点数
"^(-?/d+)(/./d+)?$"
// 由 26 个英文字母组成的字符串
"^[A-Za-z]+$"
// 由 26 个英文字母的大写组成的字符串
"^[A-Z]+$"
// 由 26 个英文字母的小写组成的字符串
"^[a-z]+$"
// 由数字和 26 个英文字母组成的字符串
"^[A-Za-z0-9]+$"
// 由数字、26 个英文字母或者下划线组成的字符串
"^/w+$"
// email 地址
"^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$"
// url
"^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$"
// 年-月-日
"^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$"
// 月/日/年
"^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$"
// Email
"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$"
// 电话号码
"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?"
// IP 地址
"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$"
// MAC 地址的正则表达式
^([0-9A-F]{2})(-[0-9A-F]{2}){5}$
// 值类型正则表达式
^[-+]?/d+(/./d+)?$
2、验证文本有效性
使用QRegExp::exactMatch来判断一个字符串是否符合一个pattern。
void testRegexMatch()
{
QString pattern(".*=.*");
QRegExp rx(pattern);
bool match = rx.exactMatch("a=3");
qDebug() << match; // True
match = rx.exactMatch("a/2");
qDebug() << match; // False
}
3、提取数据
利用正则表达式从一个字符串里提取特定的字段或数据。例如,你可以用以下代码从"a=100"里提取"a"和"100"。
void testRegexCapture()
{
QString pattern("(.*)=(.*)");
QRegExp rx(pattern);
QString str("a=100");
int pos = str.indexOf(rx); // 0, position of the first match.
// Returns -1 if str is not found.
// You can also use rx.indexIn(str);
qDebug() << pos;
if ( pos >= 0 )
{
qDebug() << rx.matchedLength(); // 5, length of the last matched string
// or -1 if there was no match
qDebug() << rx.capturedTexts(); // QStringList("a=100", "a", "100"),
// 0: text matching pattern
// 1: text captured by the 1st ()
// 2: text captured by the 2nd ()
qDebug() << rx.cap(0); // a=100, text matching pattern
qDebug() << rx.cap(1); // a, text captured by the nth ()
qDebug() << rx.cap(2); // 100,
qDebug() << rx.pos(0); // 0, position of the nth captured text
qDebug() << rx.pos(1); // 0
qDebug() << rx.pos(2); // 2
}
}
4、修改文本
你可以把字符串中匹配的字符串替换成"一般字符串"。
QString s = "a=100";
s.replace(QRegExp("(.*)="), "b=");
qDebug() << s; // b=100
QString s = "a=100";
s.replace(QRegExp("(.*)=(.*)"), "\\1\\2=\\2"); // \1 is rx.cap(1), \2 is rx.cap(2)
qDebug() << s;