【问题标题】:How to extract multiple strings from between special characters如何从特殊字符之间提取多个字符串
【发布时间】:2021-03-19 02:10:57
【问题描述】:

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

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

示例文本:

{3} Lorem ipsum "dolor" sit 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('}') 子字符串等从文本中拆分数字(这不会很好,但它会起作用)。

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    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);

    【讨论】:

      【解决方案2】:

      这样就可以了:

      var text = `{3} Lorem ipsum "dolor" sit amet, {2} consectetur adipiscing elit. {5}Sed semper; sollicitudin diam, "posuere" {3}aliquet massa pulvinar nec.`;
      
      // regex for all digits encased in {}
      var regex = /\d+(?=\})/g;
      var nums = text.match(regex);
      
      // regex for everything not a digit encased in {}
      var regex = /[^}]+(?=\{|$)/g;
      var next_text = text.match(regex);
      
      console.log(nums);
      console.log(next_text);

      【讨论】:

      • 完美:) 谢谢
      • 如果你使用前瞻,你只能在没有捕获组的情况下获得匹配:-)
      【解决方案3】:

      您可以使用类似的正则表达式并迭代每个匹配项,将每个捕获的组附加到结果数组,如下所示:

      let str = '{3} Lorem ipsum "dolor" sit amet, {2} consectetur adipiscing elit. {5}Sed semper; sollicitudin diam, "posuere" {3}aliquet massa pulvinar nec.'
      
      let regex = /\{(.)\}([^{]+)/g
      
      let match = regex.exec(str)
      let arr1 = []
      let arr2 = []
      while(match != null){
          arr1.push(match[1])
          arr2.push(match[2])
          match = regex.exec(str)
      }
      console.log(arr1)
      console.log(arr2)
      

      【讨论】:

      • 匹配数字 \d 更具体一点,因为 . 可以匹配除换行符以外的任何字符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2021-07-18
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多