Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重复捕获组_Javascript_Regex - Fatal编程技术网

Javascript 重复捕获组

Javascript 重复捕获组,javascript,regex,Javascript,Regex,我有一个包含零个或多个数字的字符串,然后是零个或多个字符。我想将数字解析为一个组,然后将所有字符分解为每个字符的单独组。我试过: ([0-9]*)([ABCD])*:正确捕获数字,但仅捕获最后一个字母 ([0-9]*)([ABCD])*):正确捕获数字,但首先捕获一组中的所有字母,然后仅捕获一组中的最后一个字母 我理解为什么会出现这些结果,但我不知道如何解决它。如何更改正则表达式以为匹配的字符提供多个组?如果我没有得到一个空组('或未定义的组),如果数字或字母不在那里,我将获得加分 例如: 1A

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

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

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

我理解为什么会出现这些结果,但我不知道如何解决它。如何更改正则表达式以为匹配的字符提供多个组?如果我没有得到一个空组(
'
未定义的组
),如果数字或字母不在那里,我将获得加分

例如:

1A
=>[1,A]

99
=>[99]

CAB
=>[C,A,B]


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

在组捕获内放置星号。星号表示0或更多,所以您试图从组捕获中捕获0或更多符号,在这种情况下,您的结果只是第一个捕获的字母。但是你需要0个或更多的字母

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

var match = "".match(/([0-9]*)([ABCD]*)/)
此代码将返回具有三个位置的数组:

  • 数学文本
  • 第一个匹配的组->所有编号
  • 第二组匹配->所有字母
  • 所以要划分字母,你可以使用

    匹配[2]。拆分(“”)


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

    var matches = "1234ABCD".match(/([0-9]*)([ABCD]*)/).slice(1);
    matches = [matches[0]].concat(matches[1].split(""));
    
    var test=document.getElementById('test');
    功能重新测试(){
    变量re=/\b([0-9]*)([ABCD]*)\b/g;
    var str=测试值;
    var发现=”;
    str.replace(re,函数(完全匹配,数字,字母){
    if(fullmatch==“”)返回;
    字母=字母。拆分(“”);
    找到+=“”+数字+“”
    找到+=“”+个字母+“\n”
    });
    document.getElementById('result').innerHTML=found;
    }
    重新测试()
    
    span.num{
    颜色:红色;
    }
    span.字母{
    颜色:蓝色;
    }
    
    123ABC
    阿尔法
    12345defg
    好极了
    驾驶室
    19
    9876vwxyz
    ...?
    
    测试

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

    Regex

    /^\d+|[ABCD]/g
    
    • ^\d+
      匹配字符串开头的整数
    • |
      …或
    • [ABCD]
      4个允许字符中的1个
    代码

    subject=“1234ABCD”;
    模式=/^\d+|[ABCD]/g;
    匹配=主题。匹配(模式);
    console.log(匹配项);
    
    //=>[“1234”、“A”、“B”、“C”、“D”]
    正则表达式如何知道每个组的长度?我们可以有测试输入字符串和测试输出结果吗?当然,我会添加一些示例扫描您运行两个单独的匹配函数吗?我可以,但我希望可以用一个regext完成。这将把字母放在一个捕获组中,而不是每个字母都放在自己的组中