正则表达式-语法

参考: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

几个例子:

  1. (abc|def|ghj) 表示这一段为abc、def、ghj三者中的一个,也只能有其中一个,顺序不能变
  2. (abc)?    ?表示abc这段,出现次数为0次或1次
  3. (?: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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值