首页 > 解决方案 > 如何从特殊字符之间提取多个字符串

问题描述

我在定义正确的正则表达式时遇到问题。

我需要将文本分成组,这样我将有一组位于大括号内的数字组和一组位于这些大括号之间的文本组/数组。

示例文本:

{3} Lorem ipsum "dolor" sat amet,{2} consectetur adipiscing elit。{5}Sed semper;sollicitudin diam,“posuere”{3}aliquet massa pulvinar nec。

我想要两个数组:

  1. [3,2,5,3]
  2. ["Lorem ipsum "dolor" sit amet", "consectetur adipiscing elit.", "Sed semper; sollicitudin diam, "posuere"", "aliquet massa pulvinar nec."]

几乎我做到了,但我对文本中的特殊字符有疑问(输入文本中禁止使用大括号字符)。我现在的正则表达式:

\{(.)\}+([\d\w\s]+)

它返回:

  1. [“{3} Lorem ipsum”、“{2} consectetur adipiscing elit”、“{5}Sed semper”、“{3}aliquet massa pulvinar nec”]

我知道以后我可以在每个数组元素上使用 .split('}') 子字符串等从文本中拆分数字(它不会很好,但它会起作用)。

标签: javascriptregex

解决方案


String.prototype.matchAll()返回所有匹配项及其捕获组的迭代器,然后您可以使用它来填充单独的数组。

const s = `{3} Lorem ipsum "dolor" sit amet, {2} consectetur adipiscing elit. {5}Sed semper; sollicitudin diam, "posuere" {3}aliquet massa pulvinar nec.`

const reg = /\{(\d+)\}(.*?)(?=\{|$)/g;
const matches = s.matchAll(reg);

const braces = [], 
  text = [];
for (const match of matches) {
  const [_, b, t] = match;
  braces.push(b);
  text.push(t);
}

console.log(braces);
console.log(text);

或映射到您选择的形状的数组。

const s = `{3} Lorem ipsum "dolor" sit amet, {2} consectetur adipiscing elit. {5}Sed semper; sollicitudin diam, "posuere" {3}aliquet massa pulvinar nec.`

const reg = /\{(\d+)\}(.*?)(?=\{|$)/g;
const matches = Array.from(s.matchAll(reg), ([_, digit, text]) => ({digit, text}));

console.log(matches);


推荐阅读