重复一个捕获组

3
我有一个包含零个或多个数字,后面跟着零个或多个字符ABCD的字符串。我希望将数字解析为一组,然后每个字符分别解析到单独的一组中。我尝试过以下正则表达式: ([0-9]*)([ABCD])*:正确地捕获了数字,但只捕获了最后一个字母。 ([0-9]*)(([ABCD])*):正确地捕获了数字,但首先将所有字母捕获到一组中,然后仅在一组中捕获最后一个字母。
我明白这两个正则表达式的原因,但不知道如何解决它。我应该如何更改我的正则表达式才能让匹配到的字母匹配到多个组?如果数字或字母不存在,则不生成空组(''undefined)。
例如: 1A => [1, A] 99 => [99] CAB => [C, A, B] 1234ABCD => [1234, A, B, C, D]

1
正则表达式如何知道每个组的长度?我们可以有测试输入字符串和测试输出结果吗? - Explosion Pills
好的,我会添加一些例子。 - Jorn
你可以运行两个独立的match函数吗? - Kirill Ryabin
我可以这样做,但我希望能够用一个正则表达式完成。 - Jorn
4个回答

2

JavaScript没有内建的“匹配所有”方法。由于你事先知道所有字母都是第二个匹配项,因此你可以自己拆分它们:

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

1

让我提出一个新策略:不要尝试一次匹配整个字符串,而是使用全局修饰符/g逐个匹配每个数字或字符,以返回所有匹配项。

正则表达式

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

代码

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

matches = subject.match(pattern);


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


0
将星号放在组捕获的内部。星号表示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. 第二个匹配组 -> 所有字母

因此,要分割字母,您可以使用

match[2].split('');


这将把字母放在一个捕获组中,而不是每个字母都在自己的组中。 - Jorn

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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接