以正则表达式模式重复组模式

时间:2009-04-22 21:11:04

标签: regex curl

所以,伙计们,我有这种自制模式。几个小时后(我不是正则表达式大师)这只小狗进化为我解析卷曲PUT输出:

   ^\s*([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)
    \s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)

(CR仅用于格式化文本)

它给了我访问的“群组” - 它有效!然而,我的编码器看到了一个模式的重复,并且它从我身上迸发出来。多年来我见过perl 你小样式的比赛让我觉得这可能 更小。但我试图打击它的尝试却惨遭失败。

所以,问题:如何以更简洁的方式编写此模式,以便我仍然可以拉出目标组?

这可能没关系,但这里是我追求的团体:

$1: percent finished
$2: size uploaded so far
$6: size to upload
$8: average upload rate 

更新:可以在我的博客文章(How to configure OnMyCommand to generate a progress bar for curl)上找到进一步的背景信息,这将解释我在做什么以及为什么我只使用正则表达式模式。我实际上并不是用一种语言编写代码,本身 ...但是配置工具来使用正则表达式。

3 个答案:

答案 0 :(得分:3)

看起来这是我能做的最好的事情:

^\s*([^ ]+)\s+([^ ]+)\s+(?:[^ ]+\s+){3}([^ ]+)\s+[^ ]+\s+([^ ]+)\s+

我崩溃了你不关心的比赛,让他们没有被捕获,并且不再需要跟踪比赛。如果匹配所有内容很重要(例如,还有其他与之匹配的行),您可以说:

^\s*([^ ]+)\s+([^ ]+)\s+(?:[^ ]+\s+){3}([^ ]+)\s+[^ ]+\s+([^ ]+)(?:\s+[^ ]){4}

注意,我的更改也会更改捕获数字:

  • $ 1:完成百分比
  • $ 2:到目前为止上传的尺寸
  • $ 3:要上传的尺寸
  • $ 4:平均上传率

如果它支持\ S

,你可以侥幸成功
^\s*(\S+)\s+(\S+)\s+(?:\S+\s+){3}(\S+)\s+\S+\s+(\S+)\s+

但这并不意味着完全相同的事情。

答案 1 :(得分:0)

((^\s*|\s+)([^ ]+)){12}

如果你不关心比赛的数量并希望匹配一个完整的字符串,只需坚持以下内容。

((^\s*|\s+)([^ ]+))*\s*$

答案 2 :(得分:0)

如果你的正则表达式使用贪心匹配,这可能有用:

^(\s*([^ ]+))+$

说明:

  • ^ =行开头
  • 重复模式= \ s *([^] +)
  • 用parens包围,并添加'+'表示'前面的一个或多个匹配'
  • $ =行尾