【问题标题】:How to regex match comma separated values in any order? [duplicate]如何以任何顺序正则表达式匹配逗号分隔值? [复制]
【发布时间】:2020-12-08 08:36:20
【问题描述】:

我正在处理一个日志行,其中包含特定字段的逗号分隔值 -

xyz=,xyz_xyztest_27_jun_2019_2:4000,a_test_case_id-20190624.1:7|431

这些逗号分隔值的记录可能以任何顺序发生。比如——

xyz=,a_test_case_id-20190624.1:7|431,xyz_xyztest_27_jun_2019_2:4000

我正在尝试在 perl 中编写一个正则表达式来匹配这些值 -

=~/^(?=.*xyz=)(?=.*xyz_xyztest_27_jun_2019_2:[\da-f]+)(?=.*a_test_case_id-20190624.1:[\da-f]+\|[\da-f]+)/

但这似乎不匹配。我错过了什么吗? 谢谢

【问题讨论】:

  • 您的模式仅包含 Lookaheads,这意味着它将仅匹配其他所有内容之后的空字符串(AKA,断言位置)。将要捕获的部分放入捕获组:^(?=.*(xyz=))(?=.*(xyz_xyztest_27_jun_2019_2:[\da-f]+))(?=.*(a_test_case_id-20190624\.1:[\da-f]+\|[\da-f]+))。演示:regex101.com/r/6OGEa0/1
  • 您已经提供了输入,您期望处理输入数据的效果是什么?
  • 尝试 2 个捕获组 \G([^\s,=]+)[=:]([^\s,=]*)(?:,|$) regex101.com/r/2zQpBn/1

标签: regex perl regex-lookarounds


【解决方案1】:

OP 的问题本质上是晦涩难懂的,没有所需结果/输出的样本。

以下代码假定字段以, 分隔,变量/值对以=: 分隔

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

while( <DATA> ) {
    chomp;
    my %hash;
    %hash = split "[,=:]";
    say Dumper(\%hash);
}

__DATA__
xyz=,xyz_xyztest_27_jun_2019_2:4000,a_test_case_id-20190624.1:7|431
xyz=,a_test_case_id-20190624.1:7|431,xyz_xyztest_27_jun_2019_2:4000

输出

$VAR1 = {
          'xyz_xyztest_27_jun_2019_2' => '4000',
          'a_test_case_id-20190624.1' => '7|431',
          'xyz' => ''
        };

$VAR1 = {
          'xyz' => '',
          'xyz_xyztest_27_jun_2019_2' => '4000',
          'a_test_case_id-20190624.1' => '7|431'
        };

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2013-09-27
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多