模式也匹配连字符

Sen*_*mar 3 regex perl

我有一个像这样的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";
}
Run Code Online (Sandbox Code Playgroud)

如果标签之间的内容没有连字符,它工作正常.如果在像这样的标签之间出现的字符串之间插入连字符,则无效<AT>this is an at-command</AT>.

即使连字符也被插入,任何人都可以修复此正则表达式吗?

帮帮我吧

塞特希

pol*_*nts 8

在角色类

您的模式包含此子模式:

[\s\w]*
Run Code Online (Sandbox Code Playgroud)

[…]是一个角色类.类似于[aeiou]匹配任何一个小写元音的东西.[^…]是一个否定的角色类.[^aeiou]匹配除小写元音之外的任何东西.

\s是空白字符类的简写; \w用于单词字符类.两者都不包含连字符.

*是零或更多的重复说明符.

现在你应该理解为什么这个模式与连字符不匹配:它匹配零个或多个字符,这些字符是空格或字符.如果要匹配连字符,则可以将其包含在字符类中.

[\s\w-]*
Run Code Online (Sandbox Code Playgroud)

例如,如果您还想要包含句点,问号和感叹号,那么您也可以简单地添加它们:

[\s\w.!?-]*
Run Code Online (Sandbox Code Playgroud)

关于连字符的特别说明

将连字符包含在字符类中时要有用.它在字符类定义中用作正则表达式元字符来定义字符范围.例如,

[a-z]
Run Code Online (Sandbox Code Playgroud)

匹配任何字符之间的范围中的一个'a''z',包括端值.相比之下,

[az-]
Run Code Online (Sandbox Code Playgroud)

匹配的恰好3个字符之一'a','z''-'.当您将-最后一个元素放在字符类中时,它将成为文字连字符而不是范围定义.你也可以将它作为第一个元素,或者将其转义(通过前面的反斜杠,这也是你逃避所有其他正则表达元字符的方式).

也就是说,以下3个字符类是相同的:

[az-]         [-az]         [a\-z]
Run Code Online (Sandbox Code Playgroud)

相关问题