2

我正在尝试从下载管理器中提取一些结果,格式为:

[#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:7s]

我想从上面的例子中提取的是一个看起来像这样的数组:

['4.3','MiB','40','MiB','10%','4.9','MiB','7','s']

我已经尝试过split各种组合,但似乎没有什么是正确的。有人会碰巧知道如何做到这一点或能够提供建议吗?

谢谢!

4

3 回答 3

3

你可以做

var arr = str.match(/ ([\d\.]+)(\w+)\/([\d\.]+)(\w+)\(([^\)]+)\).*:([\d\.]+)(\w+).*:([\d\.]+)(\w+)/).slice(1)

用你的字符串,它给

["4.3", "MiB", "40", "MiB", "10%", "4.9", "MiB", "7", "s"]

但这实际上取决于可能的字符串。只有一个例子是不可能确定的。我的建议是

  1. 确保您理解我的正则表达式(逐步阅读)
  2. 测试和适应您的领域知识

这是一个解释:在括号之间,你有捕获组,这就是我们在数组中得到的。这里是其中的一些 :

  • ([\d\.]+):该组由数字和点组成(如果要确保最多有一个点,请使用(\d+\.?\d*)
  • (\w+): 一些字母
  • ([^\)]+): 一些没有右括号的字符

请注意,如果它变得过于复杂或结构过于深入,那么正则表达式将不是正确的解决方案,您将不得不使用解析逻辑。


编辑

关注您的评论,以帮助您处理更复杂的字符串。

假设您使用此正则表达式:

/ ([\d\.]+)(\w+)\/([\d\.]+)(\w+)\(([^\)]+)\).*:([\d\.]+)(\w+) ETA:(\d+h)?(\d+m)?(\d+s)?/

然后

"[#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:1h30m7s]"

会给

["4.3", "MiB", "40", "MiB", "10%", "4.9", "MiB", "1h", "30m", "7s"]

"[#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:7s]"

会给

["4.3", "MiB", "40", "MiB", "10%", "4.9", "MiB", undefined, undefined, "7s"]

我改变了正则表达式的结尾。一个类似的组(\d+h)?意味着“一些数字后跟h,可选”。

于 2013-10-24T15:36:18.443 回答
1

我想建议一个不同的正则表达式,通常.*不是一件好事,如果由于某种原因您的输入更改它将默默地失败并返回错误的误导性结果。因此,您要确保匹配整个内容以查看它是否具有您期望的格式。

按照我的正则表达式,它的输出与 OP 要求的略有不同。

测试字符串:[#8760e4 4.3MiB/40MiB(10%) CN:2 DL:4.9MiB ETA:7s]

/\[(#\w+) (\d+.?\d*\w+)/(\d+.?\d*\w+)\((\d+%)\) CN:(\d+) DL:(\d+.?\d*\w+) ETA:(\w+)\]/

在此处输入图像描述

正则表达式分解

regex part          matched part   captured part
-------------------------------------------------
\[                  [
(#\w+)              #8760e4        #8760e4
\s
(\d+.?\d*\w+)       4.3MiB         4.3MiB
/                   /
(\d+.?\d*\w+)       40MiB          40MiB
\((\d+%)\)          (10%)          10%
\s
CN:(\d+)            CN:2           2
\s
DL:(\d+.?\d*\w+)    DL:4.9MiB      4.9MiB
\s
ETA:(\w+)           ETA:7s         7s
\]                  ]

输出:

["#8760e4", "4.3MiB", "40MiB", "10%", "2", "4.9MiB", "7s"]
于 2013-10-24T16:43:18.287 回答
0

首先,你必须按空间分割它。因此,丢弃第一个元素,选择第二个,用大写拆分,得到第一个,即 4.3,然后用 拆分第二个/,选择第一个,你将得到 MiB,再次拆分为大写,你将得到 40,然后最后由非字母数字字符分割..等等..

于 2013-10-24T15:36:14.453 回答