javascript 如何使用正则表达式将字符串拆分为字符串数组,存储正则表达式而不存储其结果?

chhqkbe1  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(103)

例如,有一行:

const string = "a {{bcd}} e {{f}}"

结果将是一个类似这样的数组:

const result = ["a", "{{bcd}}", "e", "{{f}}"];

我尝试了下面的代码,但是正则表达式的结果被发送到数组。

let string = "a {{bcd}} e {{f}}"

string = string.replace(/\s+/g, "");
const reg = /(\{\{(.*?)\}\})/g
const a = string.split(reg);
console.log(a);

它仍然保存正则表达式,但这不是必需的。

pgx2nnw8

pgx2nnw81#

要获得所需的结果,可以组合使用正则表达式和match方法。下面是一个代码示例,它将输入字符串拆分为一个数组,同时保持“((...)”部分不变:

const inputString = "a ((bcd)) e ((f))";
const regex = /(\(\([^)]+\)\))/g;

const result = inputString.split(regex).filter(Boolean);

console.log(result);

在这段代码中:
1.我们将输入字符串inputString定义为"a ((bcd)) e ((f))"
1.我们定义了一个正则表达式regex,它匹配“((...))”之间的所有内容,但不包括括号本身。
1.我们使用split方法来使用这个正则表达式拆分输入字符串。这将产生一个数组,其中“((...)”部分是分开的。
1.我们使用filter(Boolean)从结果数组中删除任何空字符串。
1.最后,我们打印result数组,它应该包含所需的输出:["a", "((bcd))", "e", "((f))"]
这段代码应该会给予你预期的结果。

efzxgjgh

efzxgjgh2#

您可以使用String::matchAll()来迭代字符串中的所有匹配并收集捕获组:

let string = " a {{bcd}} e {{f}}"

const reg = /\s*(.*?)\s*(\{\{.*?\}\})/g;
const result = []
for(const m of string.matchAll(reg)){
  result.push(...m.slice(1));
}

console.log(result);

一行代码:

console.log( [..."a {{bcd}} e {{f}}".matchAll(/\s*(.*?)\s*(\{\{.*?\}\})/g)].flatMap(m => m.slice(1)) );
monwx1rj

monwx1rj3#

说明您可以定义正则表达式的多个组合来匹配“((...))”或任何其他字符,以捕获所有可能的子字符串。

在你得到list中所有可能的子字符串后,使用 filter 过滤那些空的

验证码

// Method 1: Regex by (()) after removing spaces
string = "a ((bcd)) e ((f))"
string = string.replace(/\s+/g, "");
reg = /(\(\([^)]+\)\))/g
a = string.split(reg).filter(Boolean);  
console.log(a)

// Method 2: Regex by (( )) with spaces
string = "a ((bcd)) e ((f))"
reg = /(\(\([^)]*\)\))|\s+/g
a = string.split(reg).filter(Boolean);
console.log(a)

// Method 3: Regex by Spaces
string = "a ((bcd)) e ((f))"
/* string = string.replace(/\s+/g, ""); */
reg = /\s+/g
a = string.split(reg);
console.log(a)

相关问题