我有一段像这样的 Perl 代码(模式匹配),
$var = "<AT>this is an at command</AT>";
if ($var =~ /<AT>([\s\w]*)<\/AT>/i)
{
print "Matched in AT command\n";
print "$var\n\n";
}
如果标签之间的内容没有连字符,则效果很好。如果在标签之间的字符串之间插入连字符,则它不起作用,如下所示......<AT>this is an at-command</AT>
.
即使还插入了连字符,任何人都可以修复此正则表达式以匹配吗?
请帮助我
Senthil
关于角色类别
您的模式包含此子模式:
[\s\w]*
The […]
is a 字符类。就像是[aeiou]
匹配任意小写元音之一。[^…]
is a negated字符类。[^aeiou]
匹配其中之一除了小写元音。
\s
是空白字符类的简写;\w
对于单词字符类。两者都不包含连字符。
The *
是零个或多个重复说明符。
现在您应该明白为什么此模式不匹配连字符:它匹配零个或多个空格或单词字符。如果您想匹配连字符,则可以将其包含到字符类中。
[\s\w-]*
例如,如果您还想包含句号、问号和感叹号,那么您也可以简单地添加它们:
[\s\w.!?-]*
关于连字符的特别说明
要小心当在字符类中包含连字符时。它在字符类定义中用作正则表达式元字符来定义字符范围。例如,
[a-z]
匹配范围内的任何字符之一'a'
and 'z'
, 包括的。相比之下,
[az-]
恰好匹配 3 个字符之一,'a'
, 'z'
, and '-'
。当你把-
作为字符类中的最后一个元素,它成为文字连字符而不是范围定义。您也可以将其作为first元素,或转义它(通过在前面加上反斜杠,这也是转义所有其他正则表达式元字符的方式)。
也就是说,以下 3 个字符类是相同的:
[az-] [-az] [a\-z]
相关问题
- 正则表达式:为什么不呢[01-12]范围按预期工作吗?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)