【问题标题】:Replace everything except a matching pattern in regex替换正则表达式中匹配模式以外的所有内容
【发布时间】:2021-10-11 02:09:30
【问题描述】:

我正在尝试删除所有使用 javascripts .replace() 函数和正则表达式的匹配模式。

我想保存“日期”字段中的数字,即 11 10 2021 或 9 10 2021。此正则表达式 /[\d]{1,2} [0-9]{2} [0-9]{4}/g 与日期模式匹配,但是在使用 .replace(regex, '') 时,它会替换这些数字而不是保存它们.我只是想知道如何“反转”模式以保存数字并替换其他所有内容。

示例字符串:

SURVEY API RESULT LANDING: [{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"11 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]
    
[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]

【问题讨论】:

  • 感觉只解析 JSON 并提取 date 字段会容易得多。
  • 如果可以的话我会的——这更像是一个正则表达式练习
  • 为什么不直接使用String.prototype.match(regex)的结果?

标签: javascript regex


【解决方案1】:

要查找单个日期,请尝试以下操作

`[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]`.replace(/.*([\d]{1,2} [0-9]{2} [0-9]{4}).*/gms, "$1");

正则表达式参考https://javascript.info/regexp-introduction

【讨论】:

  • 谢谢!我同意了,但添加了一个“?”在第一个“*”作为多位日期的第一个数字被切断之后。所以得到的正则表达式是:/.*?([\d]{1,2} [0-9]{2} [0-9]{4}).*/g
  • 只要你只需要匹配 1 就可以了,尽管正如@MrMythical 所建议的那样,str.match(/[\d]{1,2} [/d]{2} [/d]{4}/)?.[0]; 在这种情况下会更直接。而不是匹配完整的字符串并使用捕获组。
【解决方案2】:

使用正则表达式exec 或字符串matchAll 代替字符串替换

执行

const regex = /[\d]{1,2} [\d]{2} [\d]{4}/g;
const str = `SURVEY API RESULT LANDING: [{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"11 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]
    
[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]`;

let match;

while(match = regex.exec(str)) {
    console.log(match[0]);
}

全部匹配

const iterator = `SURVEY API RESULT LANDING: [{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"12 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]
    
[{"_id":"616392e41a03eed562de2e8a",
"userId":"email@gmail.com",
"date":"9 10 2021",
"timeStamp":"2:26:",
"formResponse":"Survey completed"}]`.matchAll(/[\d]{1,2} [\d]{2} [\d]{4}/g);

console.log(Array.from(iterator).map(m => m[0]));

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 2021-05-26
    • 2022-08-21
    相关资源
    最近更新 更多