我有一段类似这样的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
发布于 2010-08-20 17:54:28
使用\S而不是\w。
if ($var =~ /<AT>([\s\S]*)<\/AT>/i) {发布于 2010-08-19 19:50:42
论字符类
您的模式包含以下子模式:
[\s\w]*[…]是一个。像[aeiou]这样的东西可以匹配任何一个小写元音。[^…]是一个被否定的字符类。[^aeiou]匹配除小写元音之外的任何字符之一。
\s是空白字符类的缩写;\w是word字符类的缩写。两者都不包含连字符。
*是零个或多个repetition说明符。
现在您应该理解为什么此模式不匹配连字符:它匹配零个或多个字符,这些字符要么是空格,要么是单词。如果您想匹配一个连字符,那么您可以将它包含在字符类中。
[\s\w-]*例如,如果您还想包括句点、问号和感叹号,那么也可以简单地将它们添加到:
[\s\w.!?-]*关于连字符的特别说明
在字符类中包含连字符时,请谨慎使用。它在character类定义中用作正则表达式元字符,用于定义字符范围。例如,
[a-z]匹配介于'a'和'z'之间(包括这两个值)的任意字符之一。相比之下,
[az-]恰好匹配3个字符中的一个:'a'、'z'和'-'。当您将-作为字符类中的最后一个元素时,它将变成文字连字符,而不是范围定义。您还可以将其作为第一个元素,或者对其进行转义(通过在前面加上反斜杠,这也是转义所有其他正则表达式元字符的方法)。
也就是说,以下3个字符类是相同的:
[az-] [-az] [a\-z]相关问题
发布于 2010-08-19 19:40:00
您只需在char类中添加一个连字符,如下所示:
if ($var =~ /<AT>([\s\w-]*)<\/AT>/i)此外,由于您的正则表达式中有一个/,因此您可以使用不同的分隔符,这样就可以避免转义/:
if ($var =~m{<AT>([\s\w-]*)</AT>}i)https://stackoverflow.com/questions/3521336
复制相似问题