【问题标题】:How to Regex properly in Perl?如何在 Perl 中正确正则表达式?
【发布时间】:2023-01-23 18:45:52
【问题描述】:

所以这是我想要模式化的字符串:

1#2#3#4#360

它总是以数字开头,如果后面有数字,则后面应该跟一个“#”。如果后面没有数字,那就是它会停止的地方。

显然,这些是不允许的:

#1#2#3
1#2#
1#2#3#A#B
#2#3##

这是我试过的:

my $string = '1#2#3#4'; 
if ($string =~ /^[0-9]+(#[0-9])*/){
        print("The format is good for $string"); 
}      
    else{
        die "The format is wrong";
}

但是,程序仍然会转到 else 条件。我错过了什么吗?

谢谢!

【问题讨论】:

  • /^[0-9]+(?:#[0-9]+)*$/ - 你错过了+$
  • 这不受 Perl 的约束——你也会误解你的正则表达式在每一种其他风格/上下文/语言中。问问自己为什么使用 ^ 而不使用任何 $,或者为什么先使用 + 但之后不再使用。
  • 如果我运行该代码,它不会进入 else 条件。您必须运行一些其他代码。也许您没有从运行的地方复制粘贴代码?

标签: regex perl


【解决方案1】:

您的代码不会进入 else 条件。匹配成功。您必须运行一些其他代码。但是,可以优化您的正则表达式。您可能还希望在第二个数字上使用 + 量词,并且希望锚定正则表达式以覆盖整个字符串。否则,您的示例中的字符串 2 和 3 会出现误报。所以你的正则表达式像这样改变:

/^[0-9]+(#[0-9])*/       # old
/^[0-9]+(#[0-9]+)*$/     # new

这是我测试代码:

use strict;
use warnings;

while (<DATA>) {
    print /^[0-9]+(#[0-9]+)*$/ ? "PASS ":"FAIL ", $_;
}

__DATA__
#1#2#3
1#2#
11#22#3333#4123123
1#2#3#A#B
#2#3##
1#2#3#4

输出:

FAIL #1#2#3
FAIL 1#2#
PASS 11#22#3333#4123123
FAIL 1#2#3#A#B
FAIL #2#3##
PASS 1#2#3#4

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 2014-07-18
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多