正则表达式 JavaScript
https://goregex.cn/regex-operator.html
常用元字符
正则元字符
解释
\
转义符号
^
匹配输入字符串的开始位置
$
匹配输入字符串的结束位置
*
匹配前面的子表达式零次或多次 ,等价于{0,}。
+
匹配前面的子表达式一次或多次 ,+等价于{1,}。
?
匹配前面的子表达式零次或一次 ,等价于{0,1}
当?跟在任何一个其他限制符(*,+,?,{n },{n ,},{n ,m })后面时,匹配模式是非贪婪的。 非贪婪模式尽可能少的匹配所搜索的字符串。 例如,对于字符串“oooo
”,“o+?
”将匹配单个“o
”,而“o+
”将匹配“oooo
”
{n }
匹配前面的子表达式出现的次数0
{n ,}
匹配前面的子表达式出现的最少次数
{n ,m }
匹配前面的子表达式出现的次数的范围
.
匹配除\n
之外的任何单个字符
(pattern)
子表达式
(?:pattern)
匹配pattern但不获取匹配结果,”Windows(?:97)\1”,语法错误,以为(?:97)不会获取匹配结果 C不支持,C++支持
(?=pattern)
正向肯定预查,即只检查,检查后不会改变匹配串,如111与(?=^[\d]+&)111,(?=^[\d]+&)检查后的匹配串仍然为111。C不支持,C++支持
(?!pattern)
正向否定预查,与(?=pattern),只是检查的结果相反
(?<=pattern)
反向肯定预查,例如“`(?<!95
98
NT
2000)Windows”能匹配“
3.1Windows`”,检查的是Windows前面的字符串即31。C和C++都不支持
(?<!pattern)
反向否定预查,同反向肯定预查
x\
y
匹配x或y
[xyz]
字符集合,匹配所包含的任意一个字符
xyz
负值字符集合,匹配未包含的任意字符,语义为[^(abcd)]
[a-z]
字符范围,匹配指定范围内的任意字符。
a-z
负值字符范围。匹配任何不在指定范围内的任意字符
\d
匹配一个数字字符。等价于[0-9] C不支持,C++支持
\D
匹配一个非数字字符。等价于[^0-9] C不支持,C++支持
\s
匹配任何空白字符,包括空格、制表符、换页符等等。等价[\f\n\r\t\v]
\S
匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\w
匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]
”。
\W
匹配任何非单词字符。等价于“[^A-Za-z0-9_]
”。
\num
匹配num ,其中num 是一个正整数。对所获取的匹配的引用。例如,“(.)\1
”匹配两个连续的相同字符。
\un
匹配n ,其中n 是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。C不支持,C++使用wstring/wregex/wsmatch
不常用元字符
正则元字符
解释
\n
标识一个八进制转义值或一个向后引用。如果n之前至少n个获取的子表达式,则n 为向后引用。否则,如果n 为八进制数字(0-7),则n 为一个八进制转义值。
\nm
标识一个八进制转义值或一个向后引用。如果*nm之前至少有 nm个获得子表达式,则 nm为向后引用。如果\ nm之前至少有 n个获取,则 n为一个后跟文字 m的向后引用。如果前面的条件都不满足,若 n和 m均为八进制数字(0-7),则\ nm将匹配八进制转义值 nm*。
\nml
如果n 为八进制数字(0-3),且m和l 均为八进制数字(0-7),则匹配八进制转义值nm l。
\xn
匹配n ,其中n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41
”匹配“A
”。“\x041
”则等价于“\x04&1
”。正则表达式中可以使用ASCII编码。.
\f
匹配一个换页符。等价于\x0c\
\cL。
\n
匹配一个换行符。等价于\x0a\
\cJ。
\r
匹配一个回车符。等价于\x0d\
\cM。
\t
匹配一个制表符。等价于\x09和\cI。
\v
匹配一个垂直制表符。等价于\x0b和\cK。
\cx
匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c
”字符。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b
”可以匹配“never
”中的“er
”,但不能匹配“verb
”中的“er
”。
\B
匹配非单词边界
修饰符
修饰符
含义
描述
i
ignore - 不区分大小写
将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
g
global - 全局匹配
查找所有的匹配项。
m
more - 多行匹配
使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s
特殊字符圆点 . 中包含换行符 \n
默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。
C++
https://docs.microsoft.com/zh-cn/cpp/standard-library/regular-expressions-cpp?view=msvc-170
https://zh.cppreference.com/w/cpp/regex
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <iostream> #include <iterator> #include <string> #include <regex> int main () { bool ret = std::regex_match ("111111 33" , regex ("\\w+\\s33" , regex_constants::icase)); std::string log ("Speed:400 Speed:500" ) ; std::regex r (R"(Speed:\d*)" ) ; std::smatch sm; while (regex_search (log, sm, r)) { std::cout << sm.str () << '\n' ; log = sm.suffix (); } std::regex long_word_regex ("(\\w{5,})" ) ; std::string new_s = std::regex_replace ("111111 33" , long_word_regex, "[$&]" ); std::cout << new_s << '\n' ; }
解析器的区别
元素
basic
extended
ECMAScript(默认)
grep
egrep
awk
使用 `
` 的分支结构
+
+
+
+
使用 \n
的分支结构
+
+
定位点
+
+
+
+
+
+
后向引用
+
+
+
括号表达式
+
+
+
+
+
+
使用 ()
的捕获组
+
+
+
+
使用 \(\)
的捕获组
+
+
控件转义序列
+
dsw 字符转义
+
文件格式转义
+
+
十六进制转义序列
+
标识转义
+
+
+
+
+
+
否定断言
+
否定字边界断言
+
非捕获组
+
非贪婪重复
+
八进制转义序列
+
普通字符
+
+
+
+
+
+
肯定断言
+
使用 {}
的重复
+
+
+
+
使用 \{\}
的重复
+
+
使用 *
的重复
+
+
+
+
+
+
使用 ?
和 +
的重复
+
+
+
+
Unicode Escape Sequence — Unicode 转义序列
+
通配符
+
+
+
+
+
+
Word Boundary Assert — 字边界断言
+
C
https://man7.org/linux/man-pages/man3/regcomp.3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <regex.h> int main (void ) { const char *s = "111111 33" ; const char *const re = "^\\w+\\s33$" regex_t regex; regmatch_t pmatch[1 ]; regoff_t off, len; if (regcomp(®ex, re, REG_NEWLINE)) { return 0 ; } for (int i = 0 ; ; i++) { if (regexec(®ex, s, ARRAY_SIZE(pmatch), pmatch, 0 )) { break ; } off = pmatch[0 ].rm_so + (s - str); len = pmatch[0 ].rm_eo - pmatch[0 ].rm_so; s += pmatch[0 ].rm_eo; } }