正则表达式如何匹配精确的字符串模式

时间:2021-04-28 08:25:14

标签: javascript regex

我有一个像这样的长字符串:

['2021_04_27__21_52_09', '2021_04_27__21_52_13', '2021_04_27__21_52_16']

我正在尝试使用 string.split 方法将字符串转换为数组。要正确拆分,我必须删除:

  1. [
  2. ]
  3. '
  4. (逗号)
  5. (空格)

我曾尝试使用正则表达式 [&#39$;?,? ],但这会删除所有 3 和 9(例如 2021_04_27__21_52_13 中的 3)。 我只想删除序列 &#39$; 中的 3s 和 9s。

正确的正则表达式是什么?

4 个答案:

答案 0 :(得分:1)

你可以使用

(?:'|[\][,\s])+

参见regex demo详情

  • (?: - 非捕获组匹配
    • ' - ' 子字符串
    • | - 或
    • [\][,\s] - ][、逗号或空格
  • )+ - 一次或多次。

查看 JavaScript 演示:

const str = "['2021_04_27__21_52_09', '2021_04_27__21_52_13', '2021_04_27__21_52_16']";
console.log(str.split(/(?:'|[\][,\s])+/).filter(Boolean))
// => ["2021_04_27__21_52_09", "2021_04_27__21_52_13", "2021_04_27__21_52_16"]

请注意,.filter(Boolean) 从结果数组中删除空元素。

答案 1 :(得分:0)

我倾向于在这里使用 match() 执行正则表达式查找所有方法,而不是尝试拆分:

var input = "['2021_04_27__21_52_09', '2021_04_27__21_52_13', '2021_04_27__21_52_16']";
var matches = input.match(/\d{4}_\d{2}_\d{2}__\d{2}_\d{2}_\d{2}/g);
console.log(matches);

答案 2 :(得分:0)

一种方法是分多个步骤清理字符,然后按 ; 拆分。

const str = "['2021_04_27__21_52_09', '2021_04_27__21_52_13', '2021_04_27__21_52_16']";

const clean = str
                 .replace(/[\[\]\s\,]/g,"")   // removes [] space and ,
                 .replace(/&#39/g,"")         // removes &#39
                 .split(/;/)                  // splits on ;
                 .filter(e => e.length > 0);  // removes any empty strings

console.log(clean);

答案 3 :(得分:0)

要将字符串转换为数组,我会将 ' - 它是一个编码的单引号,char(39) - 替换为 双引号 字符。根据您提供的示例,这为我们提供了有效的 JSON,然后我们可以使用 JSON.parse(),如下所示:

const str = "['2021_04_27__21_52_09', '2021_04_27__21_52_13', '2021_04_27__21_52_16']";
const str2 = str.replace(/'/g, '"')

const arr = JSON.parse(str2);
console.log(arr);

这个想法是让正则表达式尽可能简单,而不必为字符串中的其他内容做准备。它所做的只是“使引号可用”。

然后我们使用最简单的方法解析结果。