【问题标题】:Regex to Capture Specific 8-digit String in Variable using Perl正则表达式使用 Perl 在变量中捕获特定的 8 位字符串
【发布时间】:2021-10-14 17:59:33
【问题描述】:

在我的 Perl 脚本中,我有一个包含特定文件路径的变量。我需要创建一个正则表达式,可以从该变量中捕获特定的 8 位字符串。

$file_path = "/home/attachments/00883227/sample.txt 我想在“附件”之后立即捕获数字字符串。

我的(不成功的)尝试:

if($file_path =~ /attachments\/(\d{1,2,3,4,5,6,7,8}+)/)
    { $number = $1; }

但是,当我运行此脚本时,$number 变量中似乎没有存储任何内容。解决方案可能很简单?请原谅我的无知,我对 Perl 很陌生。

【问题讨论】:

标签: regex perl


【解决方案1】:

关闭,只需使用(\d{8}),如:

$file_path =~ /attachments\/(\d{8})\b/

还添加了\b,使其不再捕获任何数字。

【讨论】:

  • 感谢您的回复——完美运行!我也喜欢 \b。
【解决方案2】:

你不需要在大括号中给出这么多的数字。只需使用 {8} 来强制匹配 8 位数字。由于您的字符串中有/,因此您可以使用不同的分隔符,而不是转义斜杠:

if($file_path =~ m!attachments/(\d{8})!)
   { $number = $1; }

【讨论】:

    【解决方案3】:

    如果要精确匹配 8 位数字,只需使用 \d{8}

    if($file_path =~ /attachments\/(\d{8})/)
        { $number = $1; }
    

    【讨论】:

      【解决方案4】:
      my ($number) = ( $file_path =~ m{ (attachments/( [0-9]{8} ) }x );
      

      使用/以外的模式分隔符,例如m{ },可以避免因需要转义和出现在模式中的/字符而导致的所谓倾斜牙签综合症

      通过在列表上下文中分配给$number,捕获的子字符串立即进入$number

      通过使用x 选项,您可以使您的模式更具可读性。

      【讨论】:

        【解决方案5】:

        尝试使用:

        if($file_path =~ /attachments\/(\d+)/)
        { $number = $1; }
        

        { , }用于限制某个字符(或字符组)重复的次数。 {n,m} 表示字符(或组)应至少重复 n 次,最多重复 m 次。

        如果您确定数字字符串是 8 位长,则使用:

        if($file_path =~ /attachments\/(\d{8})/)
        { $number = $1; }
        

        { }(不带逗号)将与指定的数字完全匹配。

        【讨论】:

        • 您忘记了 8 位数的要求。
        • @Barmar OP 在他们的正则表达式中使用了+,这与他们所说的不太一致,尽管我想如果 OP 不知道正则表达式这可能是很自然的很多...
        【解决方案6】:
        my ($number) = $file_path =~ m{attachments/(\d+)};
        

        如果你想确保它正好是八位数字,

        my ($number) = $file_path =~ m{attachments/(\d{8})(?!\d)};
        

        【讨论】:

          【解决方案7】:

          简单地给出限制。

          比如,\d{3,8},它将返回 3-8 长度之间的数字。

          【讨论】:

            【解决方案8】:

            是正好是 8 位数字还是介于 1 到 8 位数字之间?

            由于您将/attachments/ 视为字符串的一部分,因此您可能不想使用标准的/../ 分隔符。也许切换到m{..}m#..#

            if ( $file_path =~ m#/attachments/\(d{1,8})/# ) {
            

            这将捕获 1 到 8 位数字。要准确捕获 8 个:

            my $number;
            if ( $file_path =~ m#/attachments/(\d{8})/# ) {
               $number = $1;
               ...
            }
            else {
                ....
            }
            

            请注意,我在 if 语句之前定义了 $digit_string。这样,它就在if 语句之后的范围内(并且在if 语句内部。(您正在使用use strict;?对吗?)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-01-17
              • 2022-01-17
              • 2010-12-19
              • 1970-01-01
              • 1970-01-01
              • 2023-01-10
              • 1970-01-01
              • 2023-01-05
              相关资源
              最近更新 更多