Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.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,我有一个输入字符串: 123453244654,ffgv,87676988FF,87657 我很难使用正则表达式将字符串中不是五位数的所有项转换为常量34567。因此,输出如下所示: 1234534567345673456734567876763456787657 为此,我考虑了两种选择: 求反字符类:不有用,因为它不直接在此表达式上执行,[^\d{5}], lookahead和lookahead:这里的问题是,在这个表达式的结果,(?!\d{5})或(?为了替换/替换的目的)中不包括不匹配的部

我有一个输入字符串:

123453244654,ffgv,87676988FF,87657

我很难使用正则表达式将字符串中不是五位数的所有项转换为常量34567。因此,输出如下所示:

1234534567345673456734567876763456787657

为此,我考虑了两种选择:

  • 求反字符类:不有用,因为它不直接在此表达式上执行
    ,[^\d{5}],

  • lookahead和lookahead:这里的问题是,在这个表达式的结果
    ,(?!\d{5})
    (?为了替换/替换的目的)中不包括不匹配的部分

  • 一旦找到所需的表达式,它将给出一个结果,以便使用标记区域(如
    \1
    \2
    )替换不匹配的零件

    正则表达式工具中是否有任何机制可以实现上述示例中提到的输出


    编辑:我非常感谢那些回答了非正则表达式解决方案的人,但如果您提供基于正则表达式的解决方案,我将更加感激。

    您不需要正则表达式。您可以使用
    str.split
    首先在逗号处拆分字符串,然后检查每个项目的长度是否大于或等于5,并且它只包含数字ts(使用
    str.isdigit
    )。最后使用
    str.join
    组合所有项目

    >>> s = '12345,3244,654,ffgv,87676,988ff,87657'
    >>> ','.join(x if len(x) >= 5 and x.isdigit() else '34567' for x in s.split(','))
    '12345,34567,34567,34567,87676,34567,87657'
    
    Javascript版本:

    function isdigit(s){
        for(var i=0; i <s.length; i++){
           if(!(s[i] >= '0' && s[i] <= '9')){
               return false;    
            }
        }
        return true;
    }
    arr = "12345,3244,654,ffgv,87676,988ff,87657".split(",");
    
    for(var i=0; i < arr.length; i++){
        if(arr[i].length < 5 || ! isdigit(arr[i])) arr[i] = '34567';
    }
    output = arr.join(",")
    
    功能为数字{
    
    对于(var i=0;i='0'&&s[i]我认为以下内容适用于长度不超过5个字母数字字符的值:

    (,(?!\d{5})\w{1,5})
    
    如果长度超过5个字母数字字符,则删除上述表达式中的
    5

    (,(?!\d{5})\w{1,})
    
    您可以使用以下方法替换:

    ,34567
    

    当然,对于特定语言(python、perl或JS),也可能有更快的非正则表达式方法。

    尝试以下方法:
    /\b(?!\d{5})[^,]+\b/g

    • 它约束单词边界之间的表达式(
      \b
    • 然后是非五位数(
      !\d{5}
      )的负前瞻
    • 后跟
    常量表达式=/\b(?!\d{5})[^,]+\b/g; 常量输入='123453244654,ffgv,87676988FF,87657'; 预期输出常量='1234534567345673456734567876763456787657'; const output=input.replace(表达式“34567”);
    log(output==expectedOutput,expectedOutput,output);
    此方法使用
    /\b(\d{5})|(\w+)\b/g

    • 我们在边界上匹配(
      \b
    • 我们的第一个捕获组捕获“好字符串”
    • 我们的松散捕获组获得剩余(坏字符串)
    • 我们的
      replacer()
    const str='123453244654,ffgv,87676988ff,87657';
    const STAND_IN='34567';
    const massageString=(str)=>{
    常量模式=/\b(\d{5})|(\w+)\b/g;
    常量替换=(匹配、好字符串、坏字符串)=>{
    if(goodstring){
    返回goodstring;
    }否则{
    返回待机时间;
    }
    }    
    常量r=str.replace(模式,replace);
    返回r;
    };
    
    控制台日志(消息传递(str))
    那么,Python、JavaScript或Perl?您使用的是什么语言?@СС27:这个问题没有提到语言,正则表达式基本上是独立于语言的。如果要添加一个语言标记,它应该是OP提到的一个,并且只有一个,在某处…@Cerbrus如果Python被错误标记,我很抱歉。IMHO,正则表达式是从Perl演变而来。PHP是基于Perl的,就像Ruby上的RoR一样。我正在使用PHP后端的JavaScript进行工作。我目前正在重建网站,从繁重的服务器端查询执行转移到MVC框架。在PHP中,我在PHP中遇到了同样的问题,但我使用拆分函数和数组循环进行了工作。现在,它是JavaScript。但是Perl中的正则表达式可以很容易地适应任何语言。我认为Python是Perl的脚本姐妹,所以我可能已经为Python添加了标签。因此,您必须添加
    PHP
    tag,这是一个您在开始时错过的标签。顺便说一句,RoR是Ruby framework,而PHP不是Perl framework。感谢您的建议。我已经重新标记了这个问题。很明显不过,OP希望在JavaScript中使用此功能。您是否可以在答案中添加JS解决方案?@Cerbrus也添加了JS解决方案。