正則表達式中的元字符是具有特殊含義的字符,它們不表示字面意義,而是用于控制匹配模式。
基本元字符
.
?(點號)
匹配除換行符(
\n
)外的任意單個字符示例:
a.b
?匹配 "aab", "a1b", "a b" 等
^
?(脫字符)
匹配字符串的開始位置
示例:
^abc
?匹配以 "abc" 開頭的字符串
$
?(美元符)
匹配字符串的結束位置
示例:
xyz$
?匹配以 "xyz" 結尾的字符串
\
?(反斜杠)
轉義字符,使后面的字符失去特殊含義
示例:
\.
?匹配實際的點號而不是任意字符
字符類元字符
[]
?(方括號)
定義字符集合,匹配其中任意一個字符
示例:
[aeiou]
?匹配任意一個元音字母
[^]
?(否定字符類)
匹配不在方括號中的任意字符
示例:
[^0-9]
?匹配任意非數字字符
-
?(連字符)
在字符類中表示范圍
示例:
[a-z]
?匹配任意小寫字母
量詞元字符
*
?(星號)
匹配前面的子表達式零次或多次
示例:
ab*c
?匹配 "ac", "abc", "abbc" 等
+
?(加號)
匹配前面的子表達式一次或多次
示例:
ab+c
?匹配 "abc", "abbc" 但不匹配 "ac"
?
?(問號)
匹配前面的子表達式零次或一次
示例:
colou?r
?匹配 "color" 和 "colour"
{n}
?(花括號)
精確匹配n次
示例:
a{3}
?匹配 "aaa"
{n,}
至少匹配n次
示例:
a{2,}
?匹配 "aa", "aaa" 等
{n,m}
匹配n到m次
示例:
a{2,4}
?匹配 "aa", "aaa", "aaaa"
分組和選擇元字符
()
?(圓括號)
定義子表達式或捕獲組
示例:
(ab)+
?匹配 "ab", "abab" 等
|
?(豎線)
表示"或"關系
示例:
cat|dog
?匹配 "cat" 或 "dog"
特殊字符類元字符
\d
:匹配任意數字,等價于?[0-9]
\D
:匹配任意非數字,等價于?[^0-9]
\w
:匹配任意單詞字符(字母、數字、下劃線),等價于?[a-zA-Z0-9_]
\W
:匹配任意非單詞字符,等價于?[^a-zA-Z0-9_]
\s
:匹配任意空白字符(空格、制表符、換行符等)
\S
:匹配任意非空白字符
邊界匹配元字符
\b
匹配單詞邊界
示例:
\bcat\b
?匹配 "cat" 但不匹配 "category"
\B
匹配非單詞邊界
示例:
\Bcat\B
?匹配 "scattered" 中的 "cat" 但不匹配單獨的 "cat"
其他元字符
\n
:匹配換行符
\t
:匹配制表符
\r
:匹配回車符
\f
:匹配換頁符
\v
:匹配垂直制表符
貪婪與非貪婪量詞
默認情況下,量詞(*
,?+
,??
,?{}
)是貪婪的,會盡可能多地匹配字符。在量詞后加?
可使其變為非貪婪(懶惰)模式:
*?
:零次或多次,但盡可能少+?
:一次或多次,但盡可能少??
:零次或一次,但盡可能少{n,m}?
:n到m次,但盡可能少
示例:<.*?>
?匹配HTML標簽時不會跨標簽匹配
正向和負向預查
(?=...)
?(正向肯定預查)
匹配后面跟著特定模式的位置
示例:
Windows(?=95|98)
?匹配后面跟著95或98的"Windows"
(?!...)
?(正向否定預查)
匹配后面不跟著特定模式的位置
示例:
Windows(?!95|98)
?匹配后面不跟著95或98的"Windows"
(?<=...)
?(反向肯定預查)
匹配前面是特定模式的位置
示例:
(?<=95|98)Windows
?匹配前面是95或98的"Windows"
(?<!...)
?(反向否定預查)
匹配前面不是特定模式的位置
示例:
(?<!95|98)Windows
?匹配前面不是95或98的"Windows"
實例
接下來我們分析一個匹配郵箱的正則表達式,如下圖:
QString inputStr = "abc12.000";QRegExp regExp("[0-9.]", Qt::CaseInsensitive);QString numberStr;// 遍歷字符串,提取所有匹配的字符(即數字和小數點)int pos = 0;while ((pos = regExp.indexIn(inputStr, pos)) != -1){numberStr += regExp.cap(0); // cap(0) 獲取當前匹配的字符pos += regExp.matchedLength(); // 移動到下一個匹配位置}// 輸出numberStr = 12.000;