参考:http://www.runoob.com/regexp/regexp-syntax.html
正则表达式(regular expression)描述了一中字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或从某个串中取出某个条件的字串等等。
普通字符
普通字符包括没有显示指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号
非打印字符
字符 | 描述 |
\cx | 匹配由x指明的控制字符。例如,\cM匹配 Ctrl+M或回车符。 x必须为A-Z或a-z之一,否则将c视为一个'c'字符 |
\f | 匹配一个换页符。等价于\x0c和\cL |
\n | 匹配一个换行符。等价于 \x0a 和 \cJ |
\r | 匹配一个回车符。等价于 \x0d 和 \cM |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符 |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] |
\t | 匹配一个制表符。等价于 \x09 和 \cI |
\v | 匹配一个垂直制表符。等价于 \x0b 和 \cK |
特殊字符(需转义使用)
特别字符 | 描述 |
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$ |
() | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \) |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \* |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+ |
. | 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[ |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \? |
、 | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "(" |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^ |
{ | 标记限定符表达式的开始。要匹配 {,请使用 \{ |
| | 指明两项之间的一个选择。要匹配 |,请使用 \| (类似于或运算) |
限定符(用来制定正则表达式的一个给定组建必须要出现的次数)
字符 | 描述 |
* | 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,} |
+ | 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,} |
? | 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1} |
{n} | n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o |
{n,} | n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*' |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格 |
贪婪量词
.* 比较器会把剩余文字整个吃掉,再逐步吐出文字,看看是否符合贪婪量词后的正则表达式。如果吐出部分符合,而吃下去的部分也符合,贪婪两次就比较成功,结果局势贪婪量词会尽可能地找出长度最长的符合文字
逐步量词
.*? 又称为懒惰量词,或非贪婪量词。比较器看到逐步量词时,会一边吃掉剩余文字,一般看看吃下的文字是否符合正则表达式,结果就是逐步量词会尽可能找出长度最短的符合文字
独吞量词
.*+ 比较器看到独吞量词时,会先将剩余文字吃掉,然后看看独吞量词部分是否符合吃下的文字,如果符合就不会再吐出来了。
预定义字
字符 | 描述 |
. | 任何字符(与行结束符可能匹配也可能不匹配 |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
圆括号():https://www.cnblogs.com/richiewlq/p/7307581.html(参考)
主要应用在限制多选结构的范围、分组、捕获文字、环视、特殊模式处理
个人感觉,()里的东西可当成是一个子表达式,同生共死,要么都有,要么都没有,不能取其中一些。另外,()中的内容将会被保存下来,可供后面的字符串复制等操作,见操作3
几个例子:
- (abc|def|ghj) 表示这一段为abc、def、ghj三者中的一个,也只能有其中一个,顺序不能变
- (abc)? ?表示abc这段,出现次数为0次或1次
- (?:abc) 表示找到一样abc的一组,但是不记录,不保存到变量中,否则可以通过x取第几个括号里的内容.比如(aaa)(bbb)(?ccc)(ddd),可用1获取(aaa)匹配到的内容,2获取(bbb)匹配到的内容。而3则跳过ccc,直接匹配(ddd)的内容
()、[]、{}的区别与联系
() 是为了提取匹配字符串的,表达式有几个()就有几个乡音的匹配字符串
[] 是为了定义匹配的字符范围。比如[a-z]匹配一个小写字母
{} 是用来定义匹配的长度的。比如\s{3}表示匹配三个空格
小贴心:
[]内特殊字符不用加反斜杠\,比如[.\+],表示匹配 '.' '\' '+'
[]外特殊字符需要加反斜杠\,比如\.\\\+,表示匹配 '.' '\' '+'
刷题练习:2017网易校招笔试题---小易最喜欢的单词
题目描述
小易喜欢的单词具有以下特性:
1.单词每个字母都是大写字母
2.单词没有连续相等的字母
3.单词没有形如“xyxy”(这里的x,y指的都是字母,并且可以相同)这样的子序列,子序列可能不连续。
例如:
小易不喜欢"ABBA",因为这里有两个连续的'B'
小易不喜欢"THETXH",因为这里包含子序列"THTH"
小易不喜欢"ABACADA",因为这里包含子序列"AAAA"
小易喜欢"A","ABA"和"ABCBA"这些单词
给你一个单词,你要回答小易是否会喜欢这个单词(只要不是不喜欢,就是喜欢)。输入描述:输入为一个字符串,都有大写字母组成,长度小于100
输出描述:如果小易喜欢输出“Likes”,不喜欢输出“Dislikes”
插入代码
#include <iostream>
#include <regex>
#include <string>
using namespace std;
int main() {
string str;
while( cin >> str ){
regex pattern1( "[^A-Z]+" ); //条件1,全是字母
regex pattern2( "[A-Z]*([A-Z])(\\1).*" ); //条件2 连续字符
regex pattern3( "[A-Z]*([A-Z])[A-Z]*([A-Z])[A-Z]*\\1[A-Z]*\\2[A-Z]*" ); //条件3 形如xyxy的字母
if( regex_match(str,pattern1) || regex_match(str,pattern2) || regex_match(str,pattern3) )
cout << "Dislikes" << endl;
else
cout << "Likes" << endl;
}
return 0;
}
pattern3中 [A-Z]*([A-Z])[A-Z]*([A-Z])[A-Z]*\\1[A-Z]*\\2[A-Z]*
[A-Z]*表示先匹配一些字母
([A-Z])表示匹配某个字母,并保存该字母,记为1
又一个[A-Z]*表示再匹配一些字母
又一个([A-Z])表示匹配某个字母,并保存该字母,记为2
后面的\\1和\\2分别表示上述1和2()里记录的字母
总的结果就是,寻找含有xyxy子序列的字符串
输出如下
ABBA
Dislikes
THETXH
Dislikes
ABACADA
Dislikes
A
Likes
ABA
Likes
ABCBA
Likes