javascript - 添加更多字符时正则表达式不匹配
问题描述
字符串 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
不管其余的是否存在。
解决方案
由于负前瞻,您的模式与第一个字符串不匹配(?!.*\..*\.)
否定前瞻断言右边的内容不包含 2 个点,这对于第一个字符串将失败,因为有301.78
和258.30ms
。
它将匹配第二个字符串,因为只有一个108.69
包含点的值。
如果您只想维护实际时间、计费时间和内存大小,则可以省略前瞻。为了防止仅使用匹配点,[.\d]+
您可以匹配带有可选小数部分的数字\d+(?:\.\d+)?
模式可能看起来像
Duration:(?<actualTime>\d+(?:\.\d+)?)msBilledDuration:(?<billedTime>\d+(?:\.\d+)?)msMemorySize:(?<memorySize>\d+(?:\.\d+)?)MB
推荐阅读
- javascript - Upload small image in a dynamic form?
- visual-studio-code - msys mingw 的集成终端设置不适用于构建任务
- reactjs - 复杂条件渲染的react方式是什么?
- c - TSP with vertices may be visited more than once
- php - Multiple WooCommerce Session for one user
- android - Android Firebase 身份验证:联合 Google 登录在 Oreo 中不起作用
- python-2.7 - numpy.transpose for producing mirror images
- jquery - jquery ajax url路径问题
- ruby-on-rails - 为什么这个 simple_fields_for 不执行?
- google-app-engine - 无法从托管在不同 GCP 项目中的 App Engine 柔性环境通过 unix 套接字连接到 Cloud SQL