如何使用可选的字母/数字后跟可选的逗号来捕获组?

时间:2015-09-11 19:26:17

标签: javascript regex

我正在改变javascript中字符串的片段并完成以下工作(第一次迭代-optional逗号)。

var foo = "wat:a,username:x,super:man"
foo.replace(/(username\:\w+)(?:,)*/,"go:home,");
//"wat:a,go:home,super:man"

现在的诀窍是我实际上可能只用键替换键/值...所以我需要用可选值+可选逗号捕获原始组。

var foo = "wat:a,username:,super:man"
foo.replace(/ ????? /,"go:home,");
//"wat:a,go:home,super:man"

作为奖励,我希望以最简洁的方式捕获可选数字/字母(更新我原来的也支持)

var foo = "wat:a,username:999,super:man"
foo.replace(/ ????? /,"go:home,");
//"wat:a,go:home,super:man"

2 个答案:

答案 0 :(得分:2)

您需要将+(前一个子模式的1次或更多次出现)量词替换为*(前一个子模式的0次或更多次出现)。

请参阅Quantifier Cheatsheet at rexegg.com

  

A+ 一个或多个 A,尽可能多(贪婪),如果引擎需要回溯(温顺),则放弃字符

     

A* 或更多A s,尽可能多(贪婪),如果引擎需要回溯(温顺),则放弃字符

此外,您没有使用模式中定义的任何捕获组,因此我建议将其删除。

.replace(/username:\w*,*/,"go:home,")
                     ^

如果您只有1个可选,,请仅使用?量词(前一个子模式的1或0次重复):

.replace(/username:\w*,?/,"go:home,")
                       ^

请注意,如果您在字符串或逗号结尾之前可以有任何字符,您还可以使用Fede建议使用否定字符类:/username:[^,]*,*/[^,]*匹配逗号以外的任何字符(甚至是换行符)。

另外,请注意您不需要逃避冒号。必须在字符类之外转义才能被视为文字的字符是.*+?^,{{1} },${()|[]。请参阅RegExp MDN reference

答案 1 :(得分:1)

我不确定我是否理解你的问题,但如果你想匹配username:??,可以使用以下正则表达式:

(username\:\w*)

<强> Working demo

enter image description here

更新:正如 stribizhev ,在他的评论\w*中指出可以做到这一点,但是如果你想将正则表达式扩展到任何您可以使用的字母或数字以外的字符:

(username\:[^,]*)