如何使用TCL通过正则表达式匹配我的预期输出

时间:2014-07-09 09:13:50

标签: regex tcl

以下是我的真实场景:

我的输出如下:

  

邻居组:测试

     

服务器地址 - 10.0.0.1邻居组:测试日期   :Jul 08 18:26:32 2014 Queries Pending:0/1
  请求方法:循环服务器地址 - 20.0.0.1邻居   组:测试日期:2014年7月8日18:26:32   查询待处理:0/1请求方法:循环

     

服务器地址 - 30.0.0.1邻居组:测试日期   :Jul 08 18:26:32 2014 Queries Pending:0/1
  请求方法:循环法

从以上所有输出中我想将输出分组到TCL列表中,

我希望从(起始分隔符)中捕获Server Address在给定字符串中开始到word before,下次Server Address到来。

因此,对于第一台服务器,regexp输出应该是:

  

{服务器地址 - 10.0.0.1邻居组:测试
  日期:Jul 08 18:26:32查询待审:
  0/1请求方法:循环}

因此,对于第二台服务器,regexp输出应该是:

  

{服务器地址 - 20.0.0.1邻居组:测试
  日期:Jul 08 18:26:32查询待审:
  0/1请求方法:循环}

同样,对于第三个服务器,起始分隔符为Server Address,然后没有其他结束分隔符,例如Server Address。因此,在这种情况下,它应该找到给定字符串的最后一个字符。

为regexp输出后的第三个服务器应该像

  

{服务器地址 - 30.0.0.1邻居组:测试
  日期:Jul 08 18:26:32查询待审:
  0/1请求方法:循环}

2 个答案:

答案 0 :(得分:2)

对于更新的问题,模式rose.*?flower似乎可以解决问题。

% set string {rose is an flower rose is an flower rose is a flower rose is a color and an flower}
% set pat rose.*?flower
% regexp -all -inline $pat $str
{rose is an flower} {rose is an flower} {rose is a flower} {rose is a color and an flower}

(为清楚起见,未引用其他命令回声。)

我怀疑你真的想做更一般的事情,但我只能回答你提出的问题。

答案 1 :(得分:1)

根据您的修订问题,您需要一个非常糟糕的RE来获得您想要的内容:

% regexp -all -inline {rose(?:\s*(?!rose)\S)*} $string
{rose is an flower} {rose is an flower} {rose is a flower} {rose is not a place}

如果你不介意一些额外的空格,你可以使用这个更简单的空格:

% regexp -all -inline {rose(?:(?!rose).)*} $string
{rose is an flower } {rose is an flower } {rose is a flower } {rose is not a place}

但是,我认为你并没有告诉我们你正在做的事情是什么。正则表达式非常特定于您尝试做的事情;概括它们并不是一件容易的事。