软件构造学习笔记:正则表达式学习

1.元字符

正则表达式由一些普通字符和一些元字符(metacharacters)组成

普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,相关含义如下表所示:

元字符含义
\转义字符。例如,“n”会匹配小写字母n,但是“\n”则会匹配换行符\n
^匹配行首
$匹配行尾
*匹配前面的子表达式任意次(大于等于0次)。例如,zo*能匹配“z”,也能匹配“zo”以及“zoo”。*等价于{0,}。
+匹配前面的子表达式一次或多次(大于等于1次)。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
?匹配前面的子表达式0次或1次。例如,“do(es)?”可以匹配“do”或“does”。?等价于{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}表示最少匹配n次且最多匹配m次,其中m和n均为非负整数,其中n<=m。例如,“o{1,3}”将匹配“fooooood”中的前三个o为一组,后三个o为一组。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
?(很神奇)当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少地匹配所搜索的字符串,而默认的贪婪模式则尽可能多地匹配所搜索的字符串。例如,对于字符串“oooo”,“o+”将尽可能多地匹配“o”,得到结果[“oooo”],而“o+?”将尽可能少地匹配“o”,得到结果 [‘o’, ‘o’, ‘o’, ‘o’]
.匹配除“\n”和"\r"之外的任何单个字符。**要匹配包括“\n”和"\r"在内的任何字符,请使用像“[\s\S]”的模式。
xy
[xyz]字符集合。**匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
[^xyz]负值字符集合。**匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“plin”任一字符。
[a-z]字符范围。**匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出字符组的开头,则只能表示连字符本身.
[^a-z]负值字符范围。**匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
\b匹配一个单词的边界,也就是指单词和空格间的位置(即正则表达式的“匹配”有两种概念,一种是匹配字符,一种是匹配位置,这里的\b就是匹配位置的)。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”;“\b1_”可以匹配“1_23”中的“1_”,但不能匹配“21_3”中的“1_”。
\B匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
\cx**匹配由x指明的控制字符。**例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
\d匹配一个数字字符。**等价于[0-9]。grep 要加上-P,perl正则支持
\D匹配一个非数字字符。**等价于[^0-9]。grep要加上-P,perl正则支持
\f匹配一个换页符。**等价于\x0c和\cL。
\n匹配一个换行符。**等价于\x0a和\cJ。
\r匹配一个回车符。**等价于\x0d和\cM。
\s匹配任何不可见字符,包括空格、制表符、换页符等等。**等价于[ \f\n\r\t\v]。
\S匹配任何可见字符。**等价于[^ \f\n\r\t\v]。
\t匹配一个制表符。**等价于\x09和\cI。
\v匹配一个垂直制表符。**等价于\x0b和\cK。
\w匹配包括下划线的任何单词字符。**类似但不等价于“[A-Za-z0-9_]”,这里的"单词"字符使用Unicode字符集。
\W匹配任何非单词字符。**等价于“[^A-Za-z0-9_]”。

2.匹配模式

这里专门开一小节讨论一下匹配模式:

GreedyReluctantPossessiveMeaning
X?X??X?+X, once or not at all
X*X*?X*+X, zero or more times
X+X+?X++X, one or more times
X{n}X{n}?X{n}+X, exactly n times
X{n, }X{n, }?X{n, }+X, at least n times
X{n, m}X{n, m}?X{n, m}+X, at least n but not more than m times

这三种匹配模式是完全不一样的:

  • Greedy:匹配器强制要求第一次尝试匹配时读入整个输入串,如果第一次匹配失败,则从后往前逐个字符回退并尝试再次匹配,直到匹配成功或没有字符可以回退
  • Reluctant:从输入串的首字符位置开始,再一次尝试匹配查找中指勉强地读一个字符,直到尝试读完整个字符串
  • Possessive:直接匹配整个字符串,如果完全匹配就匹配成功,否则失败
    举例:正则语法:.*foo
    输入字符串:xfooxxxxxxfoo
    匹配结果:
  • Greedy
    • I found the text “xfooxxxxxxfoo” starting at index 0 and ending at index 13.
  • Reluctant
    • I found the text “xfoo” starting at index 0 and ending at index 4.
    • I found the text “xxxxxxfoo” starting at index 4 and ending at index 13.
  • Possessive
    • No match found.

3.

很喜欢发改局马科长的一句话,“别说了别说了”。光说不练假把式,下面我们做一道例题来检验学习成果
在这里插入图片描述
答案是C

A:

  1. 不可以表示cbcbcbc(两个b串中间至少隔两个c)
  2. 可以表示cbcbcbc

B:

(这里的?就是’?'的意思),由\w代表字符,我们姑且只看后面

  1. 可以表示yyybyyy(第一个y串后的b数量可以比y少)
  2. 不可以表示yyybyyy(第一个y串后的b数量≥y)

D:

何其之假,看开头很明显就不一样,第二个字符范围都不一样

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值