代码之家  ›  专栏  ›  技术社区  ›  ta.speot.is

如何用不同的regex口味写这个

  •  1
  • ta.speot.is  · 技术社区  · 15 年前

    我有以下数据:

    a b c d FROM:<uniquepattern1>
    e f g h TO:<uniquepattern2>
    i j k l FROM:<uniquepattern1>
    m n o p TO:<uniquepattern3>
    q r s t FROM:<uniquepattern4>
    u v w x TO:<uniquepattern5>
    

    我想要一个能找到 TO: 什么时候 FROM:<uniquepattern1> 遇到,因此结果将是 uniquepattern2 uniquepattern3 .

    我对regex没希望了,我希望能有任何关于如何编写这个的指针(lookahead参数?)以及不同平台上的regex之间的任何差异(例如c.NET regex与grep与perl),可能与此处相关。

    谢谢您。

    2 回复  |  直到 15 年前
        1
  •  2
  •   cletus    15 年前

    尝试:

    /FROM:<uniquepattern1>.*\r?\n.*?TO:<(.*?)>/
    

    这是通过首先查找From锚,然后使用点通配符来实现的。点运算符可以 匹配新行,这样将消耗该行的其余部分。一个非贪婪的点通配符匹配然后消耗到下一个,并捕获尖括号之间的内容。

        2
  •  1
  •   ghostdog74    15 年前

    您对文件解析的要求很简单。不需要使用正则表达式。打开文件阅读,检查每一行 FROM:<uniquepattern1> 把下一行打印出来。此外,您的 TO 行之间只能用“:”分隔。因此,可以将其用作字段分隔符。

    用AWK

    $ awk -F":" '/FROM:<uniquepattern1>/{getline;print $2}' file
    <uniquepattern2>
    <uniquepattern3>
    

    其他语言/工具也是如此