首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式也与连字符匹配

模式也与连字符匹配
EN

Stack Overflow用户
提问于 2010-08-19 19:37:42
回答 5查看 3.9K关注 0票数 3

我有一段类似这样的Perl代码(模式匹配),

代码语言:javascript
复制
$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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-08-20 17:54:28

使用\S而不是\w。

代码语言:javascript
复制
if ($var =~ /<AT>([\s\S]*)<\/AT>/i) {
票数 2
EN

Stack Overflow用户

发布于 2010-08-19 19:50:42

论字符类

您的模式包含以下子模式:

代码语言:javascript
复制
[\s\w]*

[…]是一个。像[aeiou]这样的东西可以匹配任何一个小写元音。[^…]是一个被否定的字符类。[^aeiou]匹配除小写元音之外的任何字符之一。

\s是空白字符类的缩写;\w是word字符类的缩写。两者都不包含连字符。

*是零个或多个repetition说明符。

现在您应该理解为什么此模式不匹配连字符:它匹配零个或多个字符,这些字符要么是空格,要么是单词。如果您想匹配一个连字符,那么您可以将它包含在字符类中。

代码语言:javascript
复制
[\s\w-]*

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

代码语言:javascript
复制
[\s\w.!?-]*

关于连字符的特别说明

在字符类中包含连字符时,请谨慎使用。它在character类定义中用作正则表达式元字符,用于定义字符范围。例如,

代码语言:javascript
复制
[a-z]

匹配介于'a''z'之间(包括这两个值)的任意字符之一。相比之下,

代码语言:javascript
复制
[az-]

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

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

代码语言:javascript
复制
[az-]         [-az]         [a\-z]

相关问题

票数 8
EN

Stack Overflow用户

发布于 2010-08-19 19:40:00

您只需在char类中添加一个连字符,如下所示:

代码语言:javascript
复制
if ($var =~ /<AT>([\s\w-]*)<\/AT>/i)

此外,由于您的正则表达式中有一个/,因此您可以使用不同的分隔符,这样就可以避免转义/

代码语言:javascript
复制
if ($var =~m{<AT>([\s\w-]*)</AT>}i)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3521336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档