正则表达式之基础(二)
字符串边界匹配:
正则表达式中 可以用\b来匹配之后的一个字符必须出现在字符串的首位,也就是边界
Text:
The cat scattered its food all over the room
Test Regular Expression:
\bcat
Result:
The cat scattered its food all over the room
在这个例子中,\b规定了字符"c"必须是字符串的首位,然后再匹配"a"和"t"
"scattered"中虽然包含"cat",但是"c"显然不是在边界位置
同样,可以用\b来匹配其前一个字符必须出现在字符串的末位,也是边界位置
Text:
The cat s cattered its food all over the room
Test Regular Expression:
\bcat\b
Result:
The cat s cattered its food all over the room
在这个例子中,前一个\b规定了字符"c"必须是字符串的首位,然后再匹配"a",后一个\b规定了字符"t"必须是字符串的末位
"cattered"中虽然包含"cat",虽然"c"也在首位,但是"t"不是字符串的末位
边界的概念和相对性:
那么如何认定字符串首位和末位呢,为什么c、t的位置就是个边界呢?
在正则表达式中,边界是个相对的概念,即对于单词字符来说,一般来说非单词字符就是它的边界,对于非单词字符来说,单词字符就是它们的边界。
也就是说\w的边界就是\W,也就是说对于字母A-Z a-Z 数字0-9 和下划线_来说,它们都是单词字符,不能成为彼此的边界,只有像空格、逗号、句号等都是它们的边界,另外分隔符-也是单词字符的边界。
正则表达式在字符边界问题上 对"-"的处理方式与搜索引擎相同,会把它当做空格来处理
相反,\W的边界就是\w
匹配单词字符边界
Text:
abcxabc
abc-x,abc
Regular Expression:
\bx\b
Results:
abcxabc
abc-x,abc
匹配非单词字符边界
Text:
abc-abc
abc --abc
Regular Expression:
\b-\b
Results:
abc-abc
abc --abc
字符串非边界匹配:
有边界匹配自然就会有非边界匹配,猜也能猜出有大写字母\B来表示非边界,原理和\b是一样的
文本边界匹配:
想要匹配整个文本的首位和末位,用\b或者\B是行不通的,原因很简单,文本中的各种非单词字符都可以被认为是边界(如果我们匹配的是单词字符的话)
^匹配文本首位
$匹配文本末位
Text:
Asset.DWG Asset1.DWG Asset2.dwg
Regex:
^\sAsset\d*.DWG
Result:
Asset.DWG Asset1.DWG Asset2.dwg
==================================================================================================================
Text:
Asset.DWG Asset1.DWG Asset2.dwg
Regex:
Asset\d*.DWG\s$
Result:
Asset.DWG Asset1.DWG Asset2.DWG
子模式:
用一对"()"将一个字符串括起来就是一个子模式,它可以看做是一个单字符来进行匹配
Text:
<td>This is a test text</td><br><br><td></td>
Regex:
(<br>)+
Result:
<td>This is a test text</td><br><br><td></td>
嵌套子模式:
子模式可以再继续嵌套子模式,产生更加功能强大的匹配能力。
匹配 1900 年1 月 1 日 到 2000 年 1 月 1 日 除过闰年外的所有正确日期
Text:
These dates are matched: 1900-1-1、1928-2-28、1931-11-30、2000-1-1、1999-10-30
These dates are not matched: 1900-1-32、1928-2-29、2000-01-1、1982-12-08
These dates are not matched: 1900-1-32、1928-2-29、2000-01-1、1982-12-08
Regex:
(19\d{2}|2000)-(2-([1-9]\b|1\d|2[0-8])|([13578]|1[02])-([1-9]\b|[12]\d|3[01])|([469]|11)-([1-9]\b|[12]\d|30))
Result:
These dates are matched: 1900-1-1、1928-2-28、1931-11-30、2000-1-1、1999-10-30
These dates are not matched: 1900-1-32、1928-2-29、2000-01-1、1982-12-08