替换分隔符之间的不匹配

时间:2014-07-08 09:42:49

标签: javascript regex

我有一个输入字符串:

  

12345,3244,654,ffgv,87676,988ff,87657

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

  

12345,34567,34567,34567,87676,34567,87657

为此,我看了两个选项:

  1. 否定字符类:没用,因为它不直接在此表达式上执行,[^\d{5}],

  2. 前瞻和后瞻:此处的问题是,此表达式,(?!\d{5})(?<!\d{5}),的结果中不包含不匹配的部分替换/替换。

  3. 找到所需的表达式后,它会给出一个结果,以便可以使用\1\2等标记区域替换不匹配的部分。

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

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

5 个答案:

答案 0 :(得分:2)

你不需要正则表达式。您可以先使用str.split以逗号分隔字符串,然后对每个项目检查其长度是否大于或等于5且仅包含数字(使用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(",")

答案 1 :(得分:1)

我认为以下内容可行:

(,(?!\d{5})\w{1,5})

你可以使用:

替换
,34567

在模式中,我假设没有值超过5个字母数字字符。如果不是这种情况,您可以将其修改为\w{1,}

您可以看到demo on regex101。当然,对于特定语言也可能有更快的非正则表达式方法(python,perl或JS)

答案 2 :(得分:0)

感谢hjpotter92和Сухой27顺便删除了他的答案,感谢Cerbrus改进了问题的标记。这是我从回答者那里提炼出的解决方案。

s=s.replace(/,[, ]*/,",");
s=s.replace(/[ ,]*$/,"");
s=s.replace(/^[ ,]*/,"");
s=s.replace(/^(?!\d{10,12} *$)([^,]*)/g, "34567");
s=s.replace(/(,)(?! *\d{10,12} *,)([^,]*)/g, ",34567");
s=s.replace(/(,)(?! *\d{10,12} *$)(.*)/g, ",34567"); 

答案 3 :(得分:0)

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

  • 它限制了 word 边界(\b)之间的表达,
  • 后跟非五位数(!\d{5})的否定前瞻,
  • 后跟,之间的任何字符

const expression = /\b(?!\d{5})[^,]+\b/g;
const input = '12345,3244,654,ffgv,87676,988ff,87657';
const expectedOutput = '12345,34567,34567,34567,87676,34567,87657';

const output = input.replace(expression, '34567');
console.log(output === expectedOutput, expectedOutput, output);

答案 4 :(得分:0)

此方法使用/\b(\d{5})|(\w+)\b/g

  • 我们在边界(\b)上匹配
  • 我们的第一个捕获组捕获“好字符串”
  • 我们较宽松的捕获组得到了剩菜(坏字符串)
  • 我们的replacer()函数知道区别

const str = '12345,3244,654,ffgv,87676,988ff,87657';
const STAND_IN = '34567';

const massageString = (str) => {
    const pattern = /\b(\d{5})|(\w+)\b/g;
    const replacer = (match, goodstring, badstring) => {
        if (goodstring) {
          return goodstring;
        } else {
          return STAND_IN;
        }
    }    
    const r = str.replace(pattern,replacer);
    return r;
};

console.log( massageString(str) );