我想从下面的这种字符串打印出所有可能的句子。最好的方法是什么?
[my/your/his/her] (best/true) friend is | [who/where] is [your/her/his](best/true) friend
她真正的朋友是
谁是你最好的朋友
答案 0 :(得分:1)
没有内置功能可满足您的需求。所以你需要制定一个解决方案。
首先,您需要将此任务拆分为更重要的部分。
一部分会接受数组并在其上执行组合:
// Converts [['a'], ['b', 'c']] to ['ab', 'ac']
const combination = (parts) => {
let current = [[]]
parts.forEach(v => {
let result = []
current.forEach(c => {
v.forEach(n => {
result.push(c.concat(n))
})
})
current = result
})
return current.map(v => v.join(' '))
}
另一部分需要将输入转换为数组数组并格式化输出:
const generate = (formats) => {
let result = []
// Converts [['a'], ['b', 'c']] to ['ab', 'ac']
const combination = (parts) => {
let current = [[]]
parts.forEach(v => {
let result = []
current.forEach(c => {
v.forEach(n => {
result.push(c.concat(n))
})
})
current = result
})
return current.map(v => v.join(' '))
}
formats.split('|').forEach((format) => {
let parts = format
.split(/[\]\[\)\(]/) // split "[a] (b) c" to ["a", "b", "c"]
.filter(String) // remove empy elements
.map(s => {return s.trim()})
.filter(String) // there can be empty strings. remove those too
parts = parts.map(part => {return part.split('/')})
result = result.concat(combination(parts))
})
return result
}
let input = "[my/your/his/her] (best/true) friend is | [who/where] is [your/her/his](best/true) friend"
generate(input).forEach((v, i) => {console.log((i+1) + '. ' + v)})

这几乎是你需要的。虽然有一些角落案例应该被涵盖,但行.split(/[\]\[\)\(]/)
有点问题。但我确定你可以解决它。