前言:
此刻兄弟们对“正则表达式 横杠”大致比较珍视,各位老铁们都需要学习一些“正则表达式 横杠”的相关资讯。那么小编也在网络上汇集了一些关于“正则表达式 横杠””的相关知识,希望你们能喜欢,你们快快来学习一下吧!在项目中经常会遇到对字符串进行操作的情况,我们可以直接使用QString的一些函数,但QT提供了一个更加强大的类——QRegExp,使用正则表达式来操作字符串。
先说说我最近遇到的几个问题:
1.对输入框LineEdit中的输入内容加以限制,比如只能输入数字,并且最多5位数(因为int类型不限制位数会导致溢出问题);
2.检查输入是否正确,比如判断是否是1-9999之间的数;
3.获取一个字符串中的一段内容,比如获取2015-11-20中的2015。
为了解决这些问题,下面先看看正则表达式的基本知识。
一、基本知识
正则表达式(Regular Expression,通常简写为RegExp、RE等),预先定义一些字符或字符的组合,用于匹配文本中的一段字符串。下面是它的一些用途——
1.验证
判断字符串是否符合某个标准,比如“是一个整数”或者“没有空格”。
2.搜索
正则表达式提供了比普通字符串匹配更为强大的匹配方式,比如匹配下面的词语:mail, letter, correspondence,但是不包括email, mailman, letterbox等等。
3.查找并替换
正则表达式能够用一个不同的字符串,替换所有出现另一个字符串的地方,比如用&替换&,如果原先&后面已经有了amp;那么不替换。
【更多音视频+QT学习资料,点击下方链接免费领取↓↓,先码住不迷路~】
点击→ Qt开发必备技术栈学习路线和资料
4.分割字符串
比如,根据tab来分割字符串。
使用正则表达式首先需要了解一些符号的作用,比如\d用来匹配数字,下面结合一些例子说明。
例子
解释
[abc]
方括号中间是几个字母,表示a,b,c这三个单独的字符
[^abc]
除了a,b,c以外的字符
[a-z]
横杠表示范围,匹配a到z之间(包括a和z)的所有单个字符
[a-zA-Z]
a到z、A到Z的所有单个字符
^
在一行最前
$
在一行的最后
\s
匹配任意空白字符
\S
匹配任意非空白的字符
\d
任意数字
\D
任意非数字
\w
任意单字字符(字母、数字或下划线)
\W
任意非单字字符
(a|b)
a或b
a?
?代表0个或1个
a*
*代表0个或1个或多个
a+
+代表1个或多个
a{3}
3个a
a{3,}
3个或大于3个a
a{3,6}
a的个数在3和6之间(包括3和6)
注意:C++编译器会对反斜杠进行转换,要想在正则表达式中包括一个\,需要输入两次,例如\\s。要想匹配反斜杠本身,需要输入4次,比如\\\\。
二、在QT中的用法1.对用户输入的限制void QLineEdit::setValidator(const QValidator * v)
QLineEdit中的这个函数意思是,令LineEidt只接受验证器 v 所匹配的输入,你可以对要输入的内容进行任意的限制。
比如:限制输入框只能输入0到99999
QRegExp regExp("0|[1-9]\\d{0,4}");ui.lineEdit->setValidator(new QRegExpValidator(regExp, this));2.检查输入是否符合格式QValidator::State QRegExpValidator::validate(QString & input, int & pos) const
如果输入与正则表达式相匹配,则返回Acceptable;如果部分匹配,则返回Intermediate(部分匹配,意思是如果给它增加额外的字符则能够匹配正则表达式);如果不匹配则返回Invalid。
enum QValidator::State
这个枚举类型说明了被验证的字符串是哪种类型。
QValidator::Invalid:值为0,表示字符串完全不匹配;
QValidator::Intermediate:值为1,表示部分匹配;
QValidator::Acceptable:值为2,表示完全匹配。
// integers 1 to 9999QRegExp rx("[1-9]\\d{0,3}");// the validator treats the regexp as "^[1-9]\\d{0,3}$"QRegExpValidator v(rx, 0);QString s;int pos = 0; s = "0"; v.validate(s, pos); // returns Invalids = "12345"; v.validate(s, pos); // returns Invalids = "1"; v.validate(s, pos); // returns Acceptable rx.setPattern("\\S+"); // one or more non-whitespace charactersv.setRegExp(rx);s = "myfile.txt"; v.validate(s, pos); // Returns Acceptables = "my file.txt"; v.validate(s, pos); // Returns Invalid // A, B or C followed by exactly five digits followed by W, X, Y or Zrx.setPattern("[A-C]\\d{5}[W-Z]");v.setRegExp(rx);s = "a12345Z"; v.validate(s, pos); // Returns Invalids = "A12345Z"; v.validate(s, pos); // Returns Acceptables = "B12"; v.validate(s, pos); // Returns Intermediate // match most 'readme' filesrx.setPattern("read\\S?me(\.(txt|asc|1st))?");rx.setCaseSensitive(false);v.setRegExp(rx);s = "readme"; v.validate(s, pos); // Returns Acceptables = "README.1ST"; v.validate(s, pos); // Returns Acceptables = "read me.txt"; v.validate(s, pos); // Returns Invalids = "readm"; v.validate(s, pos); // Returns Intermediate
^[0-9]+3c$
看上面的表达式,开头的^表示必须以[0-9]+开头,结尾的$表示必须以字母c结尾,如果输入的是123a,则返回QValidator::Intermediate,表示部分匹配,如果输入的是233abc,则完全匹配。
3.截取字符串QString QRegExp::cap(int nth = 0) const
这个函数返回被第n个子表达式捕获的文本,整个匹配拥有下标0,带括号的子表达式下标从1开始。
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");int pos = rxlen.indexIn("Length: 189cm");if (pos > -1) { QString value = rxlen.cap(1); // "189" QString unit = rxlen.cap(2); // "cm" // ...}
当然关于正则表达式的知识还有很多,比如结合QString的replace、split等函数使用,更多用法可以参考Qt Assistant。
标签: #正则表达式 横杠