Skip to content

Latest commit

 

History

History
88 lines (59 loc) · 3 KB

0X38字符类.md

File metadata and controls

88 lines (59 loc) · 3 KB

0X38 字符类

前置知识

  • 0X37 搜寻字符串

正文

匹配任意字符

考虑这个问题:要在str中匹配一个以a开头,b结尾的有三个字符的字符串.中间的字母是什么都可以(但是不能是数字或者其他非字母的符号).

针对每一个可能的子串写一个判断语句显然不合适.这时就要用到正则表达式的语法.在模式p中,'%a'会被当作一个有特殊意义的组合(转义).出现它的地方可以被任何一个字符代替.

尝试代码:

p='a%ab'
string.find('aob',p)
string.find('aeb',p)
string.find('a%b',p)
string.find('a%ab',p)

类似于之前介绍过的各种字符串格式约定.正则表达式的组合还有很多.我们使用的'%a'这这张表中的符号成为字符类.也就是一个占位符表示可以匹配一类字符中的任何一个(逻辑的或关系).

组合 意义
. 表示任何一个符号(不论数字,字母或者其他)
%a 表示任意字母
%c 表示任意ASCII中的控制字符
%d 表示任意数字
%g 表示ASCII中除了空格以外的所有可打印字符
%l 表示任意小写字母
%p 表示任意标点符号
%s 表示任意的空白符
%u 表示任意的大写字母
%w 表示任意字母或者数字
%x 表示任意十六进制数中用到的数字(除了十进制数字还包含几个字母)

另外,在字符串'^$()%.[]*+-?)'中的这12个字符在正则表达式中有特殊的语法意义.如果想要匹配他们本身,必须在他们之前加上转义符'%'.

也可以给string.find传递第4个参数.当这个参数为true时.模式将被当成普通字符串进行匹配,不会解析其中的正则表达式.

str='aaabbba*ano'
p='a*'
string.find(str,p,1)
string.find(str,p,1,true)

自定义字符类

如果觉得预定义的字符类不能满足你的需求(比如你想要匹配1到5的数字或者字母abc),可以自定义字符类.

一个自定义的字符类以方括号开头结尾.方括号里的普通字符之间是或的关系.例如匹配a或b或c用:

p='[abc]'

注意,这一长串其实只匹配一个位置.只是这个位置上的字符可以是a也可以是b也可以是c.

字符类的定义中如果要出现'^$()%.[]*+-?)'中的字符,也需要转义.

自定义的字符类中可以直接使用预定义子字符类.这样自定义的字符类就是预定义的字符类的超集.

对于数字和字母还有一个特殊写法,给出开头和结尾的字符,中间加上'-'则表示开头到结尾之间的所有字符.例如:

p='[a-e4-7]'

表示小写字母a到e或者数字4到7.

如果自定义字符类要用排除模式,则在方括号内,一开始加上'^'.

p='[^1-3]'

这个字符集表示除了数字1到3以外的所有字符.

对于预定义字符集,如果把表示它的字母换成大写,就表示反选字符集.例如'%a'表示所有字母,则'%A'表示所哟非字母.

后续推荐

  • 0X39 长度匹配