首页 > 解决方案 > 在 Javascript 中使用正则表达式容纳多个值

问题描述

我有/^(?:\[)(.*)(?:\|)(.*)(?:\|)(.*)(?:\|)(.*)(?:\|)(.*)(?:\])$/捕获以下值的正则表达式字符串[john|doe|doe@email.com|doe_avatar|manager]。我也喜欢[john|doe|doe@email.com|doe_avatar]通过对两者使用相同的正则表达式来捕获价值。我怎样才能在Javascript中做到这一点?

标签: javascriptregex-groupregexp-replace

解决方案


是的,这可以通过单个正则表达式实现,方法是将最后一段及其随附的管道包含\|在一个附加的、可选的、非捕获组 ( (?:……)?) 中。

const regex =
    /^(?:\[)(.*?)(?:\|)(.*?)(?:\|)(.*?)(?:\|)(.*?)(?:(?:\|)(.*?))?(?:\])$/

const rows = [
    '[john|doe|doe@email.com|doe_avatar|manager]',
    '[jane|doe|jane@email.com|jane_avatar]',
]

const parse = str => {
    const m = str.match(regex)
    
    if (!m) return null
    
    const [fullMatch, forename, surname, email, avatar, role] = m
    
    return { fullMatch, forename, surname, email, avatar, role }
}

console.log(rows.map(parse))

正如@CertainPerformance 下面提到的,undefined如果匹配不存在,则最终捕获组的结果将是


推荐阅读