【问题标题】:how to fetch inner values from Regex nested backreference如何从正则表达式嵌套反向引用中获取内部值
【发布时间】:2010-12-02 15:42:35
【问题描述】:

我通过以下方式从服务器接收输入(示例输入数据):

[1284336000]: host1;event1;flag;state;counter;errors or warnings
[1284336000]: host2;event1;flag;state;counter;errors or warnings
[1284336000]: host1;event2;flag;state;counter;errors or warnings
[1284336000]: host2;event2;flag;state;counter;errors or warnings

我必须匹配输入并根据匹配创建一个值为 hostname-eventname 的变量。

我的正则表达式

^\[\d+\]:\s((host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$

我希望在 $2$3 等引用变量中分别包含主机和事件的名称。

例如,考虑这个输入:

[1284336000]: host1;event1;flag;state;counter;errors or warnings

我需要根据上面匹配的主机名和事件名创建一个名称为<hostname-eventname>的变量。

说,

$myVar=$2-$3  (that is, $myVar=host1-event1)

我无法再应用任何拆分操作。所以没有编程:我只能读取输入数据。是的,正则表达式属于 Perl 正则表达式类型。

我不知道我是否澄清了我的问题?

【问题讨论】:

    标签: regex perl backreference capturing-group


    【解决方案1】:

    你可以使用

    "^\[\d+\]:\s([^;]*);([^;]*)"
    

    并在前两个捕获组中包含主机和事件名称。

    【讨论】:

    • 感谢 Jens,它也有效,但主持人和活动是耦合的,因此,我采用了 Tchrist 的解决方案......但感谢您的回复。
    【解决方案2】:

    您需要使用分支重置运算符(?|…|…|…)

    ^\[\d+\]:\s(?|(host1);(event1)|(host2);(event2)|(host3);(event2)|(host2);(event1));(\w+);(\w+);(\d).+$
    

    或者更清楚:

    m{
        ^ \[ \d+ \] : \s
        (?| (host1);(event1)  # $1, $2
          | (host2);(event2)  # $1, $2
          | (host3);(event2)  # $1, $2
          | (host2);(event1)  # $1, $2
        )
        ;
        (\w+);(\w+)           # $3, $4
        ; (\d)                # $5
        .+ $
    }x
    

    【讨论】:

    • 我有点惊讶没有人拿起这个。在某些情况下,这可能是一项非常重要的技术。
    • 是的。正如 Jerry Pournelle 喜欢说的,当你需要它的时候,你就需要它。但(?|…|…|…) 并未得到广泛支持,甚至鲜为人知。 PCRE 是我所知道的唯一支持它的其他版本。
    • @Alan,我自己并不太欣赏它,因为我觉得这是一个糟糕的绷带,阻止人们转向更好的解决方案:命名捕获。但我开始看到它偶尔有用,这是一个很好的例子。顺便说一句,您是否注意到 JDK7 看起来他们将通过标准 (?<NAME>…)\k<NAME> 机制命名捕获。 .group() 将接受一个字符串参数。我不认为他们打算区分 %+%-,这也是 Python 的一个问题。它仍然很酷,尽管使用(?(DEFINE)…) 块会更酷。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多