我有一个包含零个或多个数字的字符串,然后是零个或多个字符ABCD
。我想将数字解析为一个组,然后将每个字符中的所有字符解析为一个单独的组。我试过了:
([0-9]*)([ABCD])*
:正确捕获数字,但只捕获最后一个字母
([0-9]*)(([ABCD])*)
:正确捕获数字,但首先捕获一个组中的所有字母,然后只捕获组中的最后一个字母
我理解为什么会发生这些结果,但我不知道如何修复它。如何更改我的正则表达式,为匹配的字符提供多个组?如果我没有获得空组(''
或undefined
),如果数字或字母不在那里,则可获得奖励积分。
例如:
1A
=> [1,A]
99
=> [99]
CAB
=> [C,A,B]
1234ABCD
=> [1234,A,B,C,D]
答案 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]
四个允许的字符中的一个。<强>代码强>
subject = "1234ABCD";
pattern = /^\d+|[ABCD]/g;
matches = subject.match(pattern);
console.log(matches);
//=> ["1234", "A", "B", "C", "D"]
&#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]*)/)
此代码将返回三个位置的数组:
所以要分开你可以使用的字母
匹配[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>