【问题标题】:How can I exclude unnecessary floating number from a match of floating numbers in a single line string如何从单行字符串中的浮点数匹配中排除不必要的浮点数
【发布时间】:2012-12-18 15:26:16
【问题描述】:

我是 Perl 的新手。我只想问如何使用正则表达式在搜索列表中排除不必要的浮点数。

我有这个脚本的示例部分:

#!/usr/bin/perl

use strict;
use warnings;

my $teststring = "delay PADI_DEL,del:0.352, 0.352, 0.376, 0.376 PIO PAD PADDI (PADDI:PADDI IOBUF:::IO_TYPE=SUBLVDS,BANK_VCCIO=2.5); pio_INR_drt";

$teststring =~ s/[^\d.\s]//g;
print "$teststring\n";

我希望得到这样的输出:

0.352 0.352 0.376 0.376

提取是正确的,但在我寻找的最后一个浮点数之后我得到了不必要的数字。使用我的代码的实际输出是这样的:

0.352 0.352 0.376 0.376      2.5  

我将如何修改我的正则表达式,使其不会检测到“2.5”不必要的浮点数。

感谢您的帮助。

【问题讨论】:

  • 2.5 来自哪里?您的字符串末尾有3.3
  • 2.5 来自 $teststring ...IO_TYPE=SUBLVDS,BANK_VCCIO=2.5....的后面部分。
  • 在我写评论的时候,$teststring 的后半部分是BANK_VCCIO=3.3。 @ikegami 编辑了问题以更正此问题。
  • 我想我忽略了这一点。对不起,错误:)

标签: regex perl string-matching


【解决方案1】:

你可以先去掉父母中的东西,(最后是前面的空白):

$teststring =~ s/\([^)]*\)//;
$teststring =~ s/[^\d.\s]//g;
$teststring =~ s/^\s*//;

同样的想法是用数组来存储数字:

$teststring =~ s/\([^)]*\).*$//;
my @v = ($teststring =~ /\d+\.\d+/g);
print join (" ", @v), "\n";

【讨论】:

    【解决方案2】:

    如果你的输入格式是固定的,直接抓取浮点数可以像this一样完成

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    
    my $teststring = "delay PADI_DEL,del:0.352, 0.352, 0.376, 0.376 PIO PAD PADDI (PADDI:PADDI IOBUF:::IO_TYPE=SUBLVDS,BANK_VCCIO=3.3); pio_INR_drt";
    
    $teststring =~ s/(0\.\d+).*(0\.\d+).*(0\.\d+).*(0\.\d+)//g;
    print "$1 $2 $3 $4\n";
    

    这会搜索 0.XXX 格式的 4 个浮点数。

    【讨论】:

    • 感谢此代码。实际上,您建议的代码使我的编码更容易,因为在我检测到浮点数之后,我计划将每个浮点数分配给一个数组元素。再次感谢。
    【解决方案3】:

    如果你的浮点数总是 5 个字符长(4 个数字和一个点),这个正则表达式就可以了:

    s/[\d.]{5}//g;
    

    【讨论】:

    • 他想保留这些数字,而不是删除它们。
    【解决方案4】:
    my @nums = $teststring =~ /[\d.]+/g;
    pop @nums;
    print "@nums\n";
    

    【讨论】:

      猜你喜欢
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2016-01-03
      相关资源
      最近更新 更多