【问题标题】:Repeating a capturing group重复捕获组
【发布时间】:2015-10-30 05:08:45
【问题描述】:

我有一个包含零个或多个数字的字符串,然后是零个或多个字符ABCD。我想将数字解析为一组,然后将所有字符解析为每个字符的单独组。我试过了:

([0-9]*)([ABCD])*: 正确捕获数字,但只捕获最后一个字母

([0-9]*)(([ABCD])*): 正确捕获数字,但首先是一组中的所有字母,然后是一组中的最后一个字母

我理解为什么会出现这些结果,但我不知道如何解决。如何更改我的正则表达式以给我匹配字符的多个组?如果没有数字或字母,我没有得到一个空组(''undefined),则奖励积分。

例如:

1A => [1, A]

99 => [99]

CAB => [C, A, B]

1234ABCD => [1234, A, B, C, D]

【问题讨论】:

  • 正则表达式如何知道每个组的长度?我们可以有测试输入字符串和测试输出结果吗?
  • 好的,我会添加一些例子
  • 你能运行两个单独的匹配函数吗?
  • 我可以,但我希望可以用一个正则表达式来完成

标签: javascript regex


【解决方案1】:

JavaScript 没有“匹配所有”的内置方法。由于您提前知道所有字母都将是第二个匹配项,因此您可以自己拆分:

var matches = "1234ABCD".match(/([0-9]*)([ABCD]*)/).slice(1);
matches = [matches[0]].concat(matches[1].split(""));

【讨论】:

    【解决方案2】:

    请允许我提出一个新策略:与其尝试一次匹配整个字符串,不如将每个数字或字符与global modifier /g 匹配一次以返回所有匹配项。

    正则表达式

    /^\d+|[ABCD]/g
    
    • ^\d+ 匹配字符串开头的整数
    • | ...或...
    • [ABCD] 四个允许字符中的 1 个。

    代码

    subject = "1234ABCD";
    pattern = /^\d+|[ABCD]/g;
    
    matches = subject.match(pattern);
    
    
    console.log(matches);
    //=> ["1234", "A", "B", "C", "D"]

    【讨论】:

      【解决方案3】:

      在组捕获中添加星号。星号表示 0 个或更多,因此您尝试从组捕获中捕获 0 个或更多符号,在这种情况下,您的结果只是第一个捕获的字母。但是你需要 0 个或多个 A B C D 字母。

      ([0-9]*)([ABCD]*)
      ([0-9]*)([A-D]*) //same thing
      

      //更新

      var match = "".match(/([0-9]*)([ABCD]*)/)
      

      此代码将返回包含三个位置的数组:

      1. 数学文本
      2. 第一个匹配组 -> 所有号码
      3. 第二个匹配组 -> 所有字母

      所以你可以使用分割字母

      匹配[2].split('');

      【讨论】:

      • 这会将字母放在一个捕获组中,而不是每个都在自己的组中
      【解决方案4】:

      var test = document.getElementById('test');
      
      function reTest() {
        
        var re = /\b([0-9]*)([ABCD]*)\b/g;
        var str = test.value; 
        var found = "";
      
        str.replace(re, function(fullmatch, numbers, letters) {
          if (fullmatch == "") return;
          letters = letters.split("");
          found += "<span class='num'>" + numbers + "</span>"
          found += "<span class='letters'>" + letters + "</span>\n"
        });
        
        document.getElementById('result').innerHTML = found;
      }
      
      reTest();
      span.num {
        color:red;
      }
      
      span.letters {
        color:blue;
      }
      <textarea rows="7" cols="40" id='test'>
      123ABC
      alpha
      12345defg
      bravo
      CAB
      19
      9876vwxyz
      ...?
      </textarea><br/>
      <button onclick="reTest()">test</button><br/>
      <pre id='result'></pre>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        • 2015-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多