我是正则表达式领域的新手。
我在下面发布的所有内容都是我的代码中的简化示例。
我有一个字符串,假设test_1,some_2,foo,bar_4,我要替换为title: test (1) title: some (2) title: foo () title: bar (4)
我现在所拥有的(有效的)是:
var test = "test_1,some_2,foo,bar_4,";
console.log(test.replace(/(.*?)(?:_(\d))?,/g, "title: $1 ($2)\n"));
Run Code Online (Sandbox Code Playgroud)
输出:
title: test (1)
title: some (2)
title: foo ()
title: bar (4)
Run Code Online (Sandbox Code Playgroud)
为了使事情变得正确,我想摆脱最后一个项目后的昏迷。列表看起来像test_1,some_2,foo,bar_4 (bar_4之后无逗号)
所以新的代码:
var test = "test_1,some_2,foo,bar_4";
console.log(test.replace(/(.*?)(?:_(\d))?(?:,|$)/g, "title: $1 ($2) "));
Run Code Online (Sandbox Code Playgroud)
输出错误。最后还有一个空的比赛:
title: test (1)
title: some (2)
title: foo ()
title: bar (4)
title: ()
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么?如何解决?实际的正则表达式是否有任何可能的改进?
因为正则表达式匹配空字符串,所以您得到了最后一个假阳性匹配项:
"".replace(/(.*?)(?:_(\d))?(?:,|$)/g, "title: '$1' ('$2') ");
Run Code Online (Sandbox Code Playgroud)
title: '' ('')
Run Code Online (Sandbox Code Playgroud)
因此,在您使用完所有字符之后,将匹配一个空字符串。
您可以通过将第一个组更改为非可选来进行控制,因为它实际上并不是一个可选的组,如图所示。
/(.*?)(?:_(\d))?(?:,|$)/g
--^^--
Run Code Online (Sandbox Code Playgroud)
例如,
var str = "test_1,some_2,foo,bar_4";
test.replace(/([a-z]+)(?:_(\d))?(?:,|$)/gi, "title: '$1' ('$2') ");
Run Code Online (Sandbox Code Playgroud)
title: test (1) title: some (2) title: foo () title: bar (4)
Run Code Online (Sandbox Code Playgroud)
那是,
([a-z]+):至少匹配一个字母字符,并且gi:使字符串不区分大小写。| 归档时间: |
|
| 查看次数: |
3695 次 |
| 最近记录: |