regex - 在 Perl 中使用正则表达式拆分字符串

标签 regex perl

我需要帮助将以下字符串拆分为 (Date, ID, msecs)
May 26 09:33:33 localhost archiver: saving ID 0191070818_1462647213_489705 took 180 msec
我只想要第一个下划线之前的 ID 的第一部分。

所以这就是我希望输出的样子
May 26 09:33:33, 0191070818, 180
我无法弄清楚在正则表达式中放入什么

use strict;
use warnings;

my $data = 'May 26 09:33:33 localhost archiver: saving ID 0091070818_1432647213_489715 took 180 msec';

my @values = split('/[]/', $data);

foreach my $val (@values) {
  print "$val\n";
}

exit 0;

最佳答案

好的。这种拆分是行不通的——因为你使用了单引号,字符串是按字面使用的。由于它不会出现在您的示例文本中,因此它根本不执行任何操作。

Split 根据字段分隔符“剪切”一个字符串,这可能不是您想要的。例如。

 split ( ' ', $data ); 

会给你:
$VAR1 = [
          'May',
          '26',
          '09:33:33',
          'localhost',
          'archiver:',
          'saving',
          'ID',
          '0091070818_1432647213_489715',
          'took',
          '180',
          'msec'
        ];

鉴于您的字符串并没有真正像那样正确地“字段化”,我建议采用不同的方法:

你需要从中选择你想要的东西。假设您没有混入一些奇怪的记录:
my $data = 'May 26 09:33:33 localhost archiver: saving ID 0091070818_1432647213_489715 took 180 msec';

my ($time_str) = ( $data =~ m/^(\w+ \d+ \d{2}:\d{2}:\d{2})/ );
my ($id)       = ( $data =~ m/(\d+)_/ );
my ($msec)     = ( $data =~ m/(\d+) msec/ );
print "$time_str, $id, $msec,\n";

注意 - 您可以组合您的正则表达式模式(如某些示例所示)。我这样做是希望简化和澄清正在发生的事情。正则表达式匹配应用于 $data (因为 =~ )。括号中的“匹配”元素 ()然后提取并“返回”以插入左侧的变量中。

(注意 - 您需要在括号中包含 'my ( $msec)',因为这样会使用该值,而不是测试结果 (true/false))

关于regex - 在 Perl 中使用正则表达式拆分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31520056/

相关文章:

python - 如何从这个url中提取base、version等相关字段?

JavaScript 查找字符串中正则表达式的每个实例并将其替换为不同的值

perl - 如何使用 Perl Storable,更改哈希值

python - Python 中除空格外的正则表达式匹配

java - 在字符串中查找特定的特殊字符

java - 在java中分割包含使用符号的数学函数

php - 如何检测图像是 PNG 还是 APNG 格式?

Java直接引用哈希值

perl - 嵌套哈希 perl 中的 grep

perl - 面向对象的 Perl 中的包、模块和类有什么区别?