为什么在这个regexp中要匹配空行?
G'day 我使用以下Perl片段从Solaris集群命令中提取输出为什么在这个regexp中要匹配空行?,regex,perl,Regex,Perl,G'day 我使用以下Perl片段从Solaris集群命令中提取输出 open(CL,"$clrg status |"); my @clrg= grep /^[[:lower:][:space:]]+/,<CL>; close(CL); open(CL,“$clrgstatus |”); my@clrg=grep/^[:lower:[:space:][]+/,; 关闭(CL); 当我打印数组@clrg BTW“=>”和“的元素内容时,我得到了以下结果,这是因为[:space://
open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]+/,<CL>;
close(CL);
open(CL,“$clrgstatus |”);
my@clrg=grep/^[:lower:[:space:][]+/,;
关闭(CL);
当我打印数组@clrg BTW“=>”和“的元素内容时,我得到了以下结果,这是因为
[:space://code>匹配换行符和回车符
所以[[:space:]+
将匹配\n
、\r\n
或\n\n
但是[[:space:]{3,}
需要三个字符,空行就是\n
{1,}
和+
的意思相同:将前面的组匹配一次或多次
另外,一个典型的换行符是Unix上的\n
和Windows上的\r\n
。这是因为[:space::
也匹配换行符和回车符
所以[[:space:]+
将匹配\n
、\r\n
或\n\n
但是[[:space:]{3,}
需要三个字符,空行就是\n
{1,}
和+
的意思相同:将前面的组匹配一次或多次
另外,一个典型的换行符是Unix上的\n
和Windows上的\r\n
。Hm。根据,字符类不应该包括换行符,因为它应该与\S
等效(除了它识别一个额外的字符,垂直制表符,以保持POSIX的一致性)
然而,刚刚在5.10.0上测试过,我可以验证它是否也匹配换行符。无论这是Perl中的一个bug还是文档中的一个bug,我都会留给Perl维护人员。但是为了避免直接的问题,请使用前面回答者的解决方案,只使用\s
而不是POSIX类。Hm对于,字符类不应包括换行符,因为它应该与\s
等效(除了它识别一个额外的字符垂直选项卡以保持POSIX的一致性)
但是,刚刚在5.10.0上测试过,我可以验证它是否也匹配换行符。无论这是Perl中的错误还是文档中的错误,我都将留给Perl维护人员。但是为了避免眼前的问题,请使用前面回答者的解决方案,只使用\s
而不是POSIX类。@Andomar,这些POSIX字符类不能单独使用;它们必须在另一对方括号内使用,即[[:space:].@Andomar,那些POSIX字符类不能单独使用;它们必须在另一对方括号内使用,即[[:space:].\s确实应该匹配换行符和回车符,这也是正确的[:space:]。可能您正在考虑[:blank:],它只匹配空格和制表符。\s代表“空白字符”。在所有正则表达式中,它都包括[\t\r\n]。我的错--我混淆了“空白字符”这一事实。“在正则表达式中,只有当/s标志出现时,才会匹配换行符。没有错误;\s确实应该匹配换行符和回车符,[:space:]也是如此。也许您想的是[:blank:],它只匹配空格和制表符。\s代表“空白字符”。在所有正则表达式中,它都包括[\t\r\n].我的错--我混淆了一个事实,即正则表达式中的“.”只在出现/s标志时匹配换行符。
=><=
=>nas-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=
=><=
=>apache-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=
=><=
open(CL,"$clrg status |");
my @clrg= grep /^[[:lower:][:space:]]{3,}/,<CL>;
close(CL);
=>nas-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=
=>apache-rg mcs0.cwwtf.bbc.co.uk No Online<=
=> mcs1.cwwtf.bbc.co.uk No Offline<=