重复捕获组

时间:2015-10-26 15:48:17

标签: javascript regex

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

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

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

我理解为什么会发生这些结果,但我不知道如何修复它。如何更改我的正则表达式,为匹配的字符提供多个组?如果我没有获得空组(''undefined),如果数字或字母不在那里,则可获得奖励积分。

例如:

1A => [1,A]

99 => [99]

CAB => [C,A,B]

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

4 个答案:

答案 0 :(得分:2)

JavaScript并没有内置的方法来匹配所有内容。"既然你事先知道所有的字母都是第二场比赛,你可以自己分开:

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

答案 1 :(得分:1)

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

<强>正则表达式

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

<强>代码

&#13;
&#13;
subject = "1234ABCD";
pattern = /^\d+|[ABCD]/g;

matches = subject.match(pattern);


console.log(matches);
//=> ["1234", "A", "B", "C", "D"]
&#13;
&#13;
&#13;

答案 2 :(得分:0)

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

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

// UPDATE

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

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

  1. Mathed text
  2. 第一个匹配的组 - &gt;所有数字
  3. 第二个匹配组 - &gt;所有字母
  4. 所以要分开你可以使用的字母

      

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

答案 3 :(得分:0)

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>