曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3683|回复: 0
打印 上一主题 下一主题

\w 匹配单词 | \b 匹配单词边界 | \s 匹配空白 | 锚位

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2011-9-26 17:52:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
像平常所见表示开头的 脱字符(^) 和 表示末尾的 美元符 ($) 都称为一个锚位。比如 /^\s*$/ 可以匹配一个空白行,该空白行中可以包含各种制表符以及空格。这里 \s 表示“空白” 它相当于 [\f\t\n\r ] ;其中 \f 表示换页,\t 表示制表,\n 表示换行,\r 表示回车 以及后面一个空白表示空格。

\w 表示单字匹配。注意,不是匹配整个单词,而是匹配单词字符,单词字符是“字母,下划线 以及数字”,它相当于 [A-Za-z_0-9] 。如果需要匹配完整的单词时,只需要使用加号修饰符即可。如下举例:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

$_ = "-g_r0a_d";

if (/^\w+/) {
        print "a full word matched.\n";
} else {
        print "not match a word.\n";
}

$_ = "g_r0a_d";
if (/^\w+/) {
        print "a full word matched.\n";
} else {
        print "not match a word.\n";
}

运行输出:
# ./wmatch.pl
not match a word.
a full word matched.
上面程序中在匹配模式里,脱字符 ^ 是需要的,否则匹配模式在遇到开始的连字符 '-' 时,发现不匹配 \w ,那么它会往后继续比较,直到可能找到匹配为止。

\b 用来匹配单词边界。我们经常会用 /\b单词\b/ 这种形式严格的匹配一个单词。不然,我们可能在对众多单词搜索时,会找出许多匹配结果,比如我们只想搜索 'won' 这个短语,但如果不确定一下单词边界,那么 "wonderful" ,"wonder",“wondering" 这些单词都因为包含了 "won" 而产生匹配。所以,假如使用 \bwon\b 时, 只会严格的匹配 "won" ,而不会找出包含它的其他单词。考虑下面测试代码:
[Perl] 纯文本查看 复制代码
#!/usr/bin/perl

$_ = "wonderful";

if (/\bwon/) {
        print "match\n";
} else {
        print "not match\n";
}

$_ = "wonder";

if (/\bwon/) {
        print "match\n";
} else {
        print "not match\n";
}

$_ = "wonderful";

if (/\bwoner\b/) {
        print "match\n";
} else {
        print "not match\n";
}
$_ = "wonderful";

if (/\bwonderful\b/) {
        print "match\n";
} else {
        print "not match\n";
}

运行输出:
# ./bmatch.pl
match
match
not match
match

\W 表示非单字匹配,它和 [^A-Za-z_0-9] 的效果相同。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 20:41 , Processed in 0.069235 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表