regex - 模式也匹配连字符

标签 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";
}

如果标签之间的内容没有连字符,它工作正常。如果在这样的标签之间存在的字符串之间插入连字符,则它不起作用... <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]

相关问题
  • Regex: why doesn't [01-12] range work as expected?
  • 关于regex - 模式也匹配连字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3521336/

    相关文章:

    php - 标签分隔字符串的正则表达式

    perl - Perl 中的 my ($variableName) 和 my $variableName 有什么区别?

    perl - 当您尝试使用 Perl 打印数组或散列并得到 Array(0xd3888) 时,这意味着什么?

    Perl 脚本没有运行条件语句?

    perl - 我如何在 Perl 中打印哈希名称?

    c# - 解析正则表达式-(不够)

    php - 使用 mysql/php 进行严格搜索

    php - 正则表达式(特别是 preg_split() PHP)

    perl - 在perl中更改多维哈希的第一个键

    regex - Code Golf : Regex parser