Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
4.0k views
in Technique[技术] by (71.8m points)

求一个正则表达式

email|url(name1|name2)|test(name3) 这种需要按照 | 进行分割,但是只需要分割一层,比如url里面的就不需要,该示例得到的结果是:[email,url(name1|name2),test(name3)]

上面只是示例,实际上可以有很多个:总的来说就是有两种元素无括号email,有括号test(name3|name1),右括号内部也可以包含这两种元素 这些元素会通过|进行分割,只需要根据最外层的|进行分割


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

直接正则应该做不到,但是可以先把括号里面的“|”替换成别的字符,如“@”,最后再替换回来

let s = 'email|url(name1|name2)|test(name3)'

s.replace(/((.*?)|(.*?))/ig, `$1@$2').split('|').map((item) => {
    return item.replace('@', '|')
})

如果是里面有多个括号或者竖线思路是一样的,我举得例子是替换“|”, 你可以替换“(.*?)”,包括多个层括号,你可以遍历一层一层的替换处理,然后再遍历替换回去,如:

email|url(name(name|name)) 
=> email|url(name@-1-@) 
=> email|url@-2-@

创建个临时对象存的是
{
    '@-1-@': (name|name)
    '@-2-@': (name@-1-@)
}

等分割后,再遍历替换回来

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...