我有一段这样的 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>
.即使还插入了连字符,任何人都可以修复此正则表达式以匹配吗?
请帮帮我
森蒂尔
最佳答案
在字符类
您的模式包含此子模式:
[\s\w]*
[…]
是 character class .类似 [aeiou]
匹配任何一个小写元音。 [^…]
是一个否定字符类。 [^aeiou]
匹配除小写元音之外的任何一个。\s
是空白字符类的简写; \w
用于单词字符类。两者都不包含连字符。*
是零个或多个 repetition说明符。现在您应该明白为什么这个模式不匹配连字符了:它匹配零个或多个字符,这些字符要么是空格,要么是单词字符。如果要匹配连字符,则可以将其包含在字符类中。
[\s\w-]*
例如,如果您还想包括句点、问号和感叹号,那么您也可以简单地添加它们:
[\s\w.!?-]*
关于连字符的特别说明
小心 在字符类中包含连字符时。它在字符类定义中用作正则表达式元字符来定义字符范围。例如,
[a-z]
匹配
'a'
之间的任意字符之一和 'z'
, 包括的。相比之下,[az-]
匹配正好 3 个字符之一,
'a'
, 'z'
, 和 '-'
.当你把 -
作为字符类中的最后一个元素,它变成了文字连字符而不是范围定义。你也可以把它作为第一个元素,或者转义它(通过在前面加上反斜杠,这也是你转义所有其他正则表达式元字符的方式)。也就是说,以下 3 个字符类是相同的:
[az-] [-az] [a\-z]
相关问题
[01-12]
range work as expected? 关于regex - 模式也匹配连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3521336/