mengdadae 发表于 2023-1-31 16:20

QT(2)-QRegExp

# QT(2)-QRegExp

## 1 正则表达式

1. [正则表达式——详情版+常用表达式](https://blog.csdn.net/BLWY_1124/article/details/127133108?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127133108%22%2C%22source%22%3A%22BLWY_1124%22%7D)
2.(https://blog.csdn.net/Superman___007/article/details/88637899?ops_request_misc=&request_id=&biz_id=102&utm_term=qt%E5%AE%9E%E7%8E%B0%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-88637899.142^v63^control,201^v3^control_1,213^v2^t3_control1&spm=1018.2226.3001.4187)
3. (https://blog.csdn.net/u014779536/article/details/111151907?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166847553616800182173589%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166847553616800182173589&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-111151907-null-null.142^v63^control,201^v3^control_1,213^v2^t3_control1&utm_term=QRegExp&spm=1018.2226.3001.4187)

## 2 QRegExp

### 2.1 indexIn

`int indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const`

尝试从位置偏移量(默认为0)在str中查找匹配。如果offset为-1,则从最后一个字符开始搜索;如果-2,在最后一个字符的旁边;等
返回第一个匹配的位置,如果没有匹配则返回-1。
caretMode参数可以用来指示^应该在索引0处匹配还是在偏移量处匹配。

```cpp
    QString regexStr = "^+@+(\\.+)+$";
    QRegExp regExp(regexStr);
    QString str = "123@qq.com";

    if(regExp.indexIn(str)>=0)
    {
      qDebug()<<"This is email";
    }
```

### 2.2 captureCount()

`int QRegExp::captureCount() const`

返回正则表达式中包含的捕获数。

### 2.3 capturedTexts()

`QStringList QRegExp::capturedTexts() const`

返回捕获的文本字符串的列表。

列表中的第一个字符串是整个匹配的字符串。随后的每个列表元素都包含一个与regexp的(捕获的)子表达式匹配的字符串。

### 2.4 cap

`QString QRegExp::cap(int *nth* = 0) const`

返回第n个子表达式捕获的文本。整个匹配的索引为0,括号内的子表达式的索引从1开始(不包括非捕获括号)。

```cpp
    QString regexStr = "^(+)(@+)(\\.+)+$";
    QRegExp regExp(regexStr);
    QString str = "123@qq.com";

    if(regExp.indexIn(str)>=0)
    {
      qDebug()<<regExp.indexIn(str);//0
      qDebug()<<regExp.captureCount();//3
      qDebug()<<regExp.capturedTexts();//"123@qq.com", "123", "@qq", ".com"
      qDebug()<<regExp.cap(0);//"123@qq.com"
      qDebug()<<regExp.cap(1);//"123"
      qDebug()<<regExp.cap(2);//"@qq"
      qDebug()<<regExp.cap(3);//".com"
    }
```

### 2.5 caseSensitivity()

`Qt::CaseSensitivity QRegExp::caseSensitivity() const`

如果regexp匹配时区分大小写,则返回Qt::CaseSensitive;否则返回Qt::CaseInsensitive。

### 2.6 isValid()

`bool QRegExp::isValid() const`

如果正则表达式有效,则返回true;否则返回false。无效的正则表达式永远不匹配。
模式[a-z是无效模式的一个例子,因为它缺少右方括号。
注意,regexp的有效性还可能取决于通配符标志的设置,例如*.html是有效的通配符regexp,但却是无效的完整regexp。

### 2.7 errorString()

`QString QRegExp::errorString() const`

返回一个文本字符串,解释为什么regexp模式是无效的情况为;否则返回“没有发生错误”。

```cpp
QString regexStr1 = "^[a-z$";
    QRegExp regExp1(regexStr1);
    if(!regExp1.isValid())//不是有效的正则表达式
      qDebug()<<regExp1.errorString();//"unexpected end"(意外结束)
```

### 2.8 escape

` QString QRegExp::escape(const QString &*str*)`

返回字符串str,其中每个regexp特殊字符都用反斜杠转义。特殊字符是$, (,), *, +, ., ?, [, ,], ^, {, | 和}。

```
s1 = QRegExp::escape("bingo");   // s1 == "bingo"
s2 = QRegExp::escape("f(x)");    // s2 == "f\\(x\\)"
```

这个函数对于动态构造regexp模式很有用:

```cpp
QRegExp rx("(" + QRegExp::escape(name) + "|" + QRegExp::escape(alias) + ")");
```

### 2.9 exactMatch

`bool QRegExp::exactMatch(const QString &str) const`

如果str与此正则表达式完全匹配,则返回true;否则返回false。您可以通过调用matchedLength()来确定字符串的匹配程度。
对于给定的regexp字符串R, exactMatch("R")相当于indexIn("^R$"),因为exactMatch()有效地将regexp封闭在字符串的开头和字符串锚的结尾,只是它以不同的方式设置matchedLength()。
例如,如果正则表达式是蓝色的,那么exactMatch()只对输入蓝色返回true。对于输入bluebell、blutak和lightblue, exactMatch()将返回false, matchedLength()将分别返回4、3和0。



### 2.10 isEmpty()

`bool QRegExp::isEmpty() const`

如果模式字符串为空则返回true;否则返回false。
如果你调用exactMatch()在空字符串上使用空模式,它将返回true;否则将返回false,因为它操作的是整个字符串。如果在任何字符串上调用带有空模式的indexIn(),它将返回开始偏移量(默认为0),因为空模式匹配字符串开始的' empty '。在这种情况下,matchedLength()返回的匹配长度将为0。



### 2.11 matchedLength()

`int QRegExp::matchedLength() const`

返回最后一个匹配字符串的长度,如果没有匹配则返回-1。完全符合正则表达式的字符串长度是多少

```cpp
QString regexStr = "^(+)(@+)(\\.+)+$";
QRegExp regExp(regexStr);
QString str = "123@qq.com****";
qDebug()<<regExp.exactMatch(str);//false
qDebug()<<regExp.matchedLength();//10
```

### 2.12lastIndexIn

`int QRegExp::lastIndexIn(const QString &*str*, int *offset* = -1, QRegExp::CaretMode *caretMode* = CaretAtZero) const`

尝试从位置偏移量在str中反向查找匹配。如果offset为-1(默认值),则从最后一个字符开始搜索;如果-2,在最后一个字符的旁边;等。
返回第一个匹配的位置,如果没有匹配则返回-1。
caretMode参数可以用来指示^应该在索引0处匹配还是在偏移量处匹配。
虽然是const,但这个函数设置了matchedLength()、capturedTexts()和pos()。
警告:向后搜索比向前搜索慢得多。



### 2.13pattern()

`QString QRegExp::pattern() const`

返回正则表达式的模式字符串。模式有正则表达式语法或通配符语法,具体取决于patternSyntax()。

```cpp
QString regexStr = "^(+)(@+)(\\.+)+$";
QRegExp regExp(regexStr);
qDebug()<<regExp.pattern();//"^(+)(@+)(\\.+)+$"
```

### 2.14 patternSyntax()

`QRegExp::PatternSyntax QRegExp::patternSyntax() const`

返回正则表达式使用的语法。默认值是QRegExp::RegExp。QRegExp::PatternSyntax见3.0

### 2.15pos

`int QRegExp::pos(int *nth* = 0) const`

返回搜索字符串中第n个捕获文本的位置。如果n为0(默认值),pos()返回整个匹配的位置。



```cpp
QRegExp rx("/(+)/(+)");
rx.indexIn("Output /dev/null");   // returns 7 (position of /dev/null)
rx.pos(0);                        // returns 7 (position of /dev/null)
rx.pos(1);                        // returns 8 (position of dev)
rx.pos(2);                        // returns 12 (position of null)

```

### 2.16setCaseSensitivity

`void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)`

将区分大小写的匹配设置为cs。

| Constant            | Value |
| ------------------- | ----- |
| Qt::CaseInsensitive | 0   |
| Qt::CaseSensitive   | 1   |



### 2.17 setPattern

`void QRegExp::setPattern(const QString &pattern)`

将模式字符串设置为pattern。区分大小写、通配符和最小匹配选项没有改变。



```cpp
QString regexStr = "^(+)(@+)(\\.+)+$";
QRegExp regExp;
regExp.setPattern(regexStr);
//等同于
QRegExp regExp(regexStr);
```

### 2.18 setPatternSyntax

`void QRegExp::setPatternSyntax(QRegExp::PatternSyntax syntax)`

设置正则表达式的语法模式。默认值是QRegExp::RegExp。
将语法设置为QRegExp::Wildcard 可以实现简单的壳状QRegExp::Wildcard匹配。例如,r*.txt在通配符模式下匹配字符串readme.txt,但不匹配readme。
将语法设置为QRegExp::FixedString意味着模式被解释为普通字符串。特殊字符(例如,反斜杠)不需要转义。

### 2.19 swap

`void QRegExp::swap(QRegExp &*other*)`

将正则表达式other替换为该正则表达式。这个操作非常快,从来不会失败。

## 3 QRegExp::PatternSyntax

用于解释模式含义的语法。

|          内容         |值|                           描述                           |
| :---------------------: | :--: | :----------------------------------------------------------: |
|   QRegExp::RegExp   |0   |      丰富的类Perl-like模式匹配语法。这是默认设置。         |
|    QRegExp::RegExp2   |1   |      类似RegExp,但带有贪婪量词。(在Qt 4.2中引入。)      |
|    QRegExp::Wildcard    |2   | 这提供了一个简单的模式匹配语法,类似于shell(命令解释器)用于"file globbing"的语法。参见QRegExp通配符匹配。 |
|QRegExp::WildcardUnix|3   | 这与通配符类似,但具有Unix shell的行为。通配符可以用字符"\"转义。 |
|QRegExp::FixedString   |4   | 模式是一个固定的字符串。这相当于在字符串上使用RegExp模式,其中所有元字符都使用escape()进行转义。 |
| QRegExp::W3CXmlSchema11 |5   |      该模式是由W3C XML Schema 1.1规范定义的正则表达式。      |

## 4 QRegExp::CaretMode

CaretMode枚举定义了正则表达式中插入符号(^)的不同含义。取值为:

| 内容                  | 值   | 描述                              |
| ----------------------- | ---- | ----------------------------------- |
| QRegExp::CaretAtZero    | 0    | 插入符号对应于搜索字符串中的索引0。 |
| QRegExp::CaretAtOffset| 1    | 插入符号对应于搜索的起始偏移量。    |
| QRegExp::CaretWontMatch | 2    | 插入符号永远不匹配。                |
页: [1]
查看完整版本: QT(2)-QRegExp