首页 > 解决方案 > 添加更多字符时正则表达式不匹配

问题描述

字符串 1: STARTRequestId:b4114e7d-a3e1-42c9-8104-87c3444757f8Version:$LATESTENDRequestId:b4114e7d-a3e1-42c9-8104-87c3444757f8REPORTRequestId:b4114e7d-a3e1-42c9-8104-87c3444757f8Duration:301.78msBilledDuration:400msMemorySize:256MBMaxMemoryUsed:85MBInitDuration:258.30ms

字符串 2: STARTRequestId:462e68f9-346f-48c0-8592-762f78e84010Version:$LATESTENDRequestId:462e68f9-346f-48c0-8592-762f78e84010REPORTRequestId:462e68f9-346f-48c0-8592-762f78e84010Duration:108.69msBilledDuration:200msMemorySize:128MBMaxMemoryUsed:85MB

在字符串 1 和字符串 2 之间,增加了InitDuration:258.30ms

我正在尝试正则表达式上述输出,目前,我有:

/Duration:(?<actualTime>(?!.*\..*\.)[.\d]+)msBilledDuration:(?<billedTime>(?!.*\..*\.)[.\d]+)msMemorySize:(?<memorySize>(?!.*\..*\.)[.\d]+)MB/

上面的匹配在字符串 2 中,但在字符串 1 上......但是,当InitDuration:258.30ms添加(字符串 1)时,正则表达式失败并且找不到任何结果。我不需要额外的匹配,我的目标是保持actualTime, billedTime,并且memorySize不管其余的是否存在。

标签: javascriptregex

解决方案


由于负前瞻,您的模式与第一个字符串不匹配(?!.*\..*\.)

否定前瞻断言右边的内容不包含 2 个点,这对于第一个字符串将失败,因为有301.78258.30ms

它将匹配第二个字符串,因为只有一个108.69包含点的值。

如果您只想维护实际时间、计费时间和内存大小,则可以省略前瞻。为了防止仅使用匹配点,[.\d]+您可以匹配带有可选小数部分的数字\d+(?:\.\d+)?

模式可能看起来像

Duration:(?<actualTime>\d+(?:\.\d+)?)msBilledDuration:(?<billedTime>\d+(?:\.\d+)?)msMemorySize:(?<memorySize>\d+(?:\.\d+)?)MB

正则表达式演示


推荐阅读