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
-1个或更多(由于[a-zA-Z]+
量词)ASCII字母+
-连字符-
-1位或更多数字[0-9]+
-冒号:
-1个或多个字母数字字符和水平空格(注意:如果您允许任何类型的空格,请将[A-Za-z0-9\h]+
替换为\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]+
保留在那里。