正则基础之字符组、量词
2023-01-08 本文已影响0人
Tinyspot
1. 字符组
1.1 普通字符组
- 字符组中的字符排列顺序并不影响字符组的功能,出现重复字符也不会影响
- 比如:[123], [312],[1223]
-
-范围表示法
- 比如
[a-z]
表示 a 到 z 整个范围内的字符,省去一一列出的麻烦 - 在字符组中,-表示的范围,一般是根据字符对应的码值(Code Point,也就是字符在对应编码表中的编码的数值)来确定的,码值小的字符在前,码值大的字符在后
- 比如
示例:
匹配十六进制字符
正则表达式:[0-9a-fA-F]
1.2 元字符与转义
- 转义:取消特殊含义
- 元字符可以通过加反斜杠
\
来转义 - 字符组中的横线-并不能匹配横线字符,而是用来表示范围
- –出现在不同位置,含义不同;- 如果紧邻着字符组中的[,那么它就是普通字符,其他情况下都是元字符
- 正则表达式原生字符串
[0\-9]
- 程序代码
String regx = "[0\\-9]";
-
\
也是一个元字符,匹配本身\\
1.3 排除型字符组
-
[^...]
- 第一个非数字,第二个是数字
[^0-9][0-9]
- 第一个非数字,第二个是数字
1.4 字符组简记法
- \d 等价于
[0-9]
- \w 等价于
[0-9a-zA-Z_]
, w 代表单词字符(word) - \s 等价于
[\t\r\n\v\f]
1.5 字符组运算
匹配元音字母 [aeiou]
匹配辅音字母 [[a-z]&&[^aeiou]]
, 即从26个字母中“减去”元音字母,剩下的就是辅音字母
2. 量词
2.1 通用形式 {m,n}
- 不确定长度的量词
d{m,n}
(逗号之间不能有空格) -
{n}
出现 N 次 -
{m,n}
出现 m ~ n 次 -
{m,}
至少 m 次 -
{0,n}
最多 N 次,隐式的上限是65536
2.2 常用量词(*、+、?)
-
*
等价{0,}
-
+
等价{1,}
-
?
等价{0,1}
示例1: 量词 ?
匹配 http和https,正则 https?
示例2: 量词 +
HTML tag 标签,如 <table>
正则表达式:<[^>]+>
说明:用<匹配开头的<,用>匹配结尾的>,用[^>]+匹配中间的“若干字符”
表达式 <[^/>][^>]*>
匹配 open tag,排除 </img>之类的close tag
示例3:量词 *
匹配双引号字符串(可以为空串 "")
正则表达式:"[^"]*"
3. 点号
- 点号可以匹配“任意字符”(除:换行符\n),常见的数字、字母、各种符号都可以
- 真正匹配“任意字符”可用
[\s\S]
3.1 匹配优先量词(greedy quantifier)
- 匹配优先量词,顾名思义,就是在拿不准是否要匹配的时候,优先尝试匹配
假设匹配引号里字符串用正则 ".*"
分析:
.可以匹配任何字符,*表示长度没有限制
此时 "try"
和 "try" and demo"
都能被匹配
3.2 忽略优先量词(lazy quantifier或reluctant quantifier)
忽略优先量词,把 * 改为 *?
*?
限定的元素出现次数范围与 * 完全一样,都表示“可能出现,也可能不出现,出现次数没有上限”
在实际匹配过程中,遇到能匹配的字符,先尝试“忽略”,如果后面的元素不能匹配,再尝试“匹配”