Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在Perl中使用正则表达式检查字符串是否符合精确模式_Regex_Perl - Fatal编程技术网

Regex 如何在Perl中使用正则表达式检查字符串是否符合精确模式

Regex 如何在Perl中使用正则表达式检查字符串是否符合精确模式,regex,perl,Regex,Perl,如何检查任何文本是否符合以下规则 规则[任何字母][-][任何数字][:][任何字母或数字] 例如:ABC-123:示例消息 Perl代码片段 print verifyMsg("ABC-123:Sample message"); sub verifyMsg{ my ($content) = @_; if ($content =~/^[a-zA-Z][-][0-9 :a-zA-Z]$/){ return 1; }else{ return

如何检查任何文本是否符合以下规则

规则[任何字母][-][任何数字][:][任何字母或数字]

例如:
ABC-123:示例消息

Perl代码片段

print verifyMsg("ABC-123:Sample message");

sub verifyMsg{

    my ($content) = @_;
    if ($content =~/^[a-zA-Z][-][0-9 :a-zA-Z]$/){
        return 1;
    }else{
        return 0;
    }

}

它总是返回0。请告诉我如何让它工作。

您的
[a-zA-Z]
后面需要一个
+
,因为有3个字符,而不是1个。你的其他角色类也是如此。否则,它们只匹配一个字母/一个数字

if ($content =~/^[a-zA-Z]+[-][0-9 :a-zA-Z]+$/){
将返回“1”

但这仍然不完全正确,因为你要匹配的是来自几乎任何东西的1封或更多的信,而这不是你想要的。所以我可能会:

/^[A-Z]+-\d+:/i
它匹配“word”-“digit”一行的开头,后跟冒号,并允许“message”是任何内容

或者你可以捕捉它:

print verifyMsg("ABC-123:Sample message");

sub verifyMsg {

   my ($content) = @_;
   if ( my ( $msg_code, $message ) = $content =~ m/^([A-Z]+-\d+):(.*)/i ) {
      print "$msg_code $message\n";
      return 1;
   }
   else {
      return 0;
   }
规则[任何字母][-][任何数字][:][任何字母或数字]

但是,问题中提供的输入字符串也包含空格。因此,根据该公式和输入字符串,您需要

/\A[a-zA-Z]+-[0-9]+:[A-Za-z0-9\h]+\z/
详细信息

  • \A
    -字符串的开头
  • [a-zA-Z]+
    -1个或更多(由于
    +
    量词)ASCII字母
  • -
    -连字符
  • [0-9]+
    -1位或更多数字
  • -冒号
  • [A-Za-z0-9\h]+
    -1个或多个字母数字字符和水平空格(注意:如果您允许任何类型的空格,请将
    \h
    替换为
    \s
    。如果您只允许常规空格,请将空格保留为原始模式。)
  • \z
    -字符串的末尾

参见标量上下文中的。

m/
如果成功则返回true,如果失败则返回false。通过添加
0
,我们强制它们分别为1和0

#!/usr/bin/env perl

use strict;
use warnings;

use Test::More;

while (my $case = <DATA>) {
    last unless $case =~ /\S/;
    my ($msg, $expected) = split '\s+=>\s+', $case, 2;
    ok(verify_message($msg) == $expected, $msg);
}

done_testing;

sub verify_message {
    0 + (
        $_[0] =~ m{
            ^                  # beginning of the string
            [A-Za-z]+        - # alphabetic part of identifier
            [0-9]+           : # numeric part of identifier
            [A-Za-z0-9]+       # alphanumeric sequence
            ([ ][A-Za-z0-9]+)* # possibly more alphanumeric sequences, space separated
            \z
        }x
    );
}

__DATA__
ABC-123:Sample message => 1
123-ABC:Sample message => 0
ABC-123:1 2 3 4 5 6 7  => 1
abc-123:Call 5551212   => 1
#/usr/bin/env perl
严格使用;
使用警告;
使用测试::更多;
而(我的$case=){
最后一个,除非$case=~/\S/;
my($msg,$expected)=拆分'\s+=>\s+',$case,2;
ok(确认消息($msg)=$expected$msg);
}
完成测试;
子验证消息{
0 + (
$\u0]=~m{
^#字符串的开头
[A-Za-z]+-#标识符的字母部分
[0-9]+:#标识符的数字部分
[A-Za-z0-9]+#字母数字序列
([[A-Za-z0-9]+)*#可能更多字母数字序列,空格分隔
\z
}x
);
}
__资料__
ABC-123:示例消息=>1
123-ABC:示例消息=>0
ABC-123:1234567=>1
abc-123:拨打5551212=>1
输出:

ok 1 - ABC-123:Sample message ok 2 - 123-ABC:Sample message ok 3 - ABC-123:1 2 3 4 5 6 7 ok 4 - abc-123:Call 5551212 1..4 ok 1-ABC-123:示例消息 ok 2-123-ABC:示例消息 ok 3-ABC-123:1234567 ok 4-abc-123:拨打5551212 1..4 笔记:
$
将匹配字符串末尾的可选换行符。通过使用
\z
显式地引用字符串的结尾,我避免了意外地漏掉换行符。有时让他们通过是可以的,有时他们可能会导致意想不到的后果,所以我建议不允许他们,除非他们被明确允许

您可以添加更多内容并使用测试用例来查看规范是否完整:例如,如果电话号码中有破折号,测试4将失败。

尝试以下操作:

print verifyMsg("ABC-123:Sample message");

sub verifyMsg{

    my ($content )= @_;
    print"$content\n";
    if ($content =~/^[a-z]+-\d+\:[\w\s+]+$/i){
       return 1;
    }
    else{
      return 0;
   }

 }

示例中的最后一个字符类还包含一个空格。@Sobrique:是的,但要求中没有提到这一点。它可以写任何字母或数字。@SinanÜnür:不再,我用
\z
锚替换了
$
。@WiktorStribiżew当我输入代码时,上面的正则表达式不起作用,但你以前的模式起作用了<代码>~/^[a-zA-Z]+-[0-9]+:[a-zA-z0-9\s]+$/@WiktorStribiżew用
\s
替换为
\h
效果良好。这是正则表达式
[a-zA-Z]+-[0-9]+:[a-zA-z0-9\h]
,如果字符串末尾除了指定的字符外还有一个换行符,则检查将成功。这可能是可以接受的,也可能是不可以接受的。单词不仅仅是字母,所以
\w
将匹配数字和下划线。OP可能想把
[a-zA-Z]+
保留在那里。