乍一看,这似乎有点毛茸茸,所以我希望有人可以一次性给它。
目的是将字符串拆分为子字符串数组,将之前或之后拆分的字符作为子字符串组件的一部分保留(即,没有像在典型拆分中那样丢失)。分裂应该在'中定义的字符之后立即发生。并且恰好在“开始”中定义的字符之前使用'。
最初我用' endsWith'功能,它工作正常(如帖子中进一步说明),但当我添加' startsWith'功能开始变得有点暗淡。
var input = "foo bar;baz#qux>quux,rawr";
var startsWith = ['#', ','];
var endsWith = [';', '\\s', '>'];
var re = new RegExp("(?=[" + startsWith.join('') + "])(.*?[" + endsWith.join('') + "]+)", "g");
console.log(re); //=> /(?=[#,])(.*?[;\s>]+)/g
var result = input.split(re).filter(Boolean);
console.log(result);
结果:[' foo bar; baz',' #qux>',' quux,rawr' ]
预期:[' foo',' bar;',' baz',' #qux>',&# 39; quux',',rawr' ]
问题在于它没有在空格或分号之后分裂,奇怪的是它在大于号之后分裂。
(在启动后添加第二个字符后,很明显它不会在共同点上分裂 - 无论正则表达式中的'#'和','的顺序如何)
另一个有趣的事情是删除' startsWith'东西,只是制作它:
var re = new RegExp("(.*?[" + endsWith.join('') + "]+)", "g");
console.log(re); //=> /(.*?[;\s>]+)/g
半冒号和空白现在有效:[' foo',' bar;',' baz#qux>',&#39 ; QUUX,RAWR' ]
但是我也想要startsWith功能(将'#qux'和',rawr'分开),我不明白我为什么会看到这个这个问题重新加入。
答案 0 :(得分:1)
现在检查
var input = "abc&foo bar;baz#qux>quux,awrr";
var re = /([#,]?[^#;>\s,]*[\;\s\>]?){1}/g
console.log(re);
var result = input.split(re).filter(Boolean);
console.log(result);

答案 1 :(得分:0)
定义您的re
对象:
var re = new RegExp("([" + startsWith.join('') + "]+.*?[" + endsWith.join('') +
"]+)|[" + endsWith.join('') + "]+");
//=> /(#.*?[;\s>])|[;\s>]+/
#
与其中一个结尾字符之间的捕获组,以便split
在结果中返回相同的捕获文本endsWith
数组定义的给定字符之一。然后将其用作:
var result = input.split(re).filter(Boolean);
//=> ["foo", "bar", "baz", "#qux>", "quux"]
答案 2 :(得分:0)
我认为这应该有效:
const splitChars = [' ', ';', '#', '>']
const regex = new RegExp(`(.*?(?:${splitChars.join('|')}))`)
let str = "foo bar;baz#qux>quux"
const array = str.split(regex).filter(x => x != "")
console.log(array)