请教一个分割特定字符串为数组的实现方法?

发布于 2022-09-12 12:54:02 字数 230 浏览 17 评论 0

let data = '[foo bar]/[red]/1 [foo bar]/[blue]/2'

// => ['foo bar/red/1', 'foo bar/blue/2']

let data = '[foo bar]/[red]/1 [foo bar]/2'

// => ['foo bar/red/1', 'foo bar/2']

求一个更好的方法,谢谢各位大佬~~~~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

ゝ杯具 2022-09-19 12:54:02

更新 2020-10-16

function splitIt(s) {
    return s
        // 直接 split 不行,但是可以先 replace 再 split
        // 原因不明,如果谁知道告诉一声,谢谢!!!
        .replace(/(?:(?<=(^|\])[^[]*)\s){1,}(?=.*?\[)/g, "|")
        .split("|")
        .map(s => s.replace(/[[\]]/g, ""));
}
console.log(splitIt(data));

测试用例:

const data = "23/23 23/25 23/[blue 1]/25 [1 foo bar]/[red]/1 23/[blue]/2 23/2 [blue]/2 [blue flow]/2";
console.log(splitIt(data));

// [
//     '23/23',
//     '23/25',
//     '23/blue 1/25',
//     '1 foo bar/red/1',
//     '23/blue/2',
//     '23/2',
//     'blue/2',
//     'blue flow/2'
// ]

这部分算是扯蛋,先括起来吧

匹配空白字符:/\s+/g

然后,对其前导条件有要求:/(?<=.......)\s+/g (省略号这里表示占位)

要求是不在括号内,也就是说,前面是反方括号,并且在这个反方括号和空白之间没有别的方括号或空白,
所以 /\][^[\s]*/,代入省略号:/(?<=\][^[\s]*)\s+/g

还要考虑,一开始就没有方括号的情况,所以把 \] 变成 (^|\],就是 /(?<=(?:^|\])[^[\s]*)\s+/g


其实仔细思考一下,所有字符串都是用方括号包起来的,只要这个空格前面是数字,或者反方括号就符合条件,所以:/(?<=(?:\d|\]))\s+/g

结果:

function splitIt(s) {
    return s
        .split(/(?<=(?:\d|\]))\s+/g)
        .map(s => s.replace(/[[\]]/g, ""));
}
你的背包 2022-09-19 12:54:02
// 字符串


var str = '[foo bar]/[red]/1 [foo bar]/[blue]/2'
var re = /\[(.+?)\]/g;   // [] 中括号

// var founds = str.match(re)
// console.log(founds,'founds')

var foundf = [...str.matchAll(re)];
var found = [...foundf];
//["[foo bar]", "[red]", "[foo bar]", "[blue]"]
var mat_str = []
var yuan_str = []
found.map(v => {
    yuan_str.push(v[1])
    mat_str.push(v[1].split(' ').join('--'))
    console.log(v[1].split(' ').join('--'),'ccvvv')
})

console.log(mat_str, yuan_str);

yuan_str.map((v,i)=>{
    // let regs = /`${v}`/
    let regs = new RegExp(`${v}`,"g")
    console.log(regs,'reg')

    str = str.replace(regs, mat_str[i])
})
console.log(str,'strsss')

console.log(found,'found')
// strsss [foo--bar]/[red]/1 [foo--bar]/[blue]/2 转译完之后 直接去掉左右括号
str = str.replace(/\[/g, "")
str = str.replace(/\]/g, "")
// => foo--bar/red/1 foo--bar/blue/2
var strArr = str.split(" ")
strArr = strArr.map(v => {
    return v = v.split("--").join(" ")
})

console.log(str, 'strsss')
console.log(strArr, 'strArr')
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文