我有一个输入字符串:
12345,3244,654,ffgv,87676,988ff,87657
我很难使用正则表达式将字符串中不是五位数的所有项转换为常量34567。所以,输出将是这样的:
12345,34567,34567,34567,87676,34567,87657
为此,我看了两个选项:
否定字符类:没用,因为它不直接在此表达式上执行,[^\d{5}],
前瞻和后瞻:此处的问题是,此表达式,(?!\d{5})
或(?<!\d{5}),
的结果中不包含不匹配的部分替换/替换。
找到所需的表达式后,它会给出一个结果,以便可以使用\1
,\2
等标记区域替换不匹配的部分。
正则表达式工具中是否有任何机制来实现上述示例中提到的输出?
编辑:我非常感谢那些已经回答非正则表达式解决方案的人,但如果您提供基于正则表达式的解决方案,我将非常感激。
答案 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
\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) );