Regex 在正则表达式模式中重复组模式
所以,伙计们,我有一个自己制作的模式,可以工作。几个小时后(我不是正则表达式大师),这只小狗进化为我解析curl-PUT输出:Regex 在正则表达式模式中重复组模式,regex,curl,Regex,Curl,所以,伙计们,我有一个自己制作的模式,可以工作。几个小时后(我不是正则表达式大师),这只小狗进化为我解析curl-PUT输出: ^\s*([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+) \s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+) (仅用于格式化的文本CR) 它给我提供了我可以访问的“组”——它很有效!然而,我身上的编码员看到了一种模式的重
^\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
更新:更多的背景可以在我的一篇博客文章()中找到,这篇文章将解释我在做什么,以及为什么我只需要一个正则表达式模式。实际上,我并不是在用一种语言编写代码,而是在配置一个工具来使用正则表达式
((^\s*|\s+)([^ ]+)){12}
如果您不关心匹配的数量,并且希望匹配一个完整的字符串,只需坚持以下内容
((^\s*|\s+)([^ ]+))*\s*$
看来这是我能做的最好的了:
^\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+){3}(\S+)\s+\S+\s+(\S+)\s+
但这并不意味着完全相同的事情。如果您的正则表达式使用贪婪匹配,这可能会起作用:
^(\s*([^ ]+))+$
说明:
- ^=线路起点
- 重复模式=\s*([^]+)
- 用括号括起来,加上“+”表示“一个或多个前面的匹配”
- $=行尾