我有一个字符串列表
time:1001 name:foo avg:5.7
time:1002
time:1003 avg:1.2
time:1004 name:f
time:1005 name:bar avg:2.1
我想挑出与time:value name:value avg:value
完全匹配的字符串并提取
[time, 1001], [name, foo], [avg, 5.7]
[time, 1005], [name, bar], [avg, 2.1]
使用regex:/(\w+):\s*(?:"([^"]*)"|(\S+))/g
代码:
const regex = /(\w+):\s*(?:"([^"]*)"|(\S+))/g;
let match = regex.exec(line);
我知道所有的台词,
[time, 1001], [name, foo], [avg, 5.7]
[time:1002], [name:undefined], [avg, undefined]
[time:1003], [name:undefined], [avg:1.2]
[time:1004], [name:f], [avg, undefined]
[time, 1005], [name, bar], [avg, 2.1]
如何选择所有键值都存在的那些
3条答案
按热度按时间a11xaf1n1#
一种可能的方法,它完全消耗数据blob,就像…
...可以基于全局标记的regex like...
...它使用named capturing groups并通过
matchAll
应用。由于生成的迭代器的数组表示仅具有有效匹配,因此可以
map
所述数组,其中对于每个迭代步骤,确实通过例如a template literal.然后,Map的数组只需要用newline
/'\n'
进行join
。接下来提供的可执行示例代码生成的结果正是OP所要求的,从而证明了上面所说的/解释的所有内容......
与OP的正则表达式不同,它通常捕获每个键值对,同时不知道键,上面的正则表达式非常明确地指出了应该匹配什么。它不仅声明每个键的名称,还要求键值对匹配的特定序列。
这就是OP的正则表达式不能全局操作多行字符串的原因。虽然它可以用于单行,但OP似乎没有正确处理匹配结果...但是OP没有提供这部分代码。
下一个示例代码演示了OP的正则表达式的可能用法,它精确地创建了OP的预期结果。然而,regex和下面的实现都不适合任何不是当前使用的多行数据形式的数据,因为人们从不检查匹配的键名的有效性。
ds97pgxw2#
让你的regexp与键完全匹配,而不是使用
\w+
来匹配任何东西。wqlqzqxt3#
这个问题被编辑了好几次,误导了大家。最后一次编辑在regexp中包含了双引号。所以基本上我不再关心了。这里只列出2种方法,并对它们进行基准测试,以供我将来参考:
您可以动态创建regexp以使用捕获组:
或者使用
{3}
来告诉你一行中只需要3个键:值对,然后手动解析一行:正如我所期望的那样,动态regexp的速度明显更快,因为它已经包含了捕获的令牌: