带有分号和空格的JavaScript正则表达式

时间:2017-02-10 10:14:29

标签: javascript regex

乍一看,这似乎有点毛茸茸,所以我希望有人可以一次性给它。

目的是将字符串拆分为子字符串数组,将之前或之后拆分的字符作为子字符串组件的一部分保留(即,没有像在典型拆分中那样丢失)。分裂应该在'中定义的字符之后立即发生。并且恰好在“开始”中定义的字符之前使用'。

最初我用' 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'分开),我不明白我为什么会看到这个这个问题重新加入。

3 个答案:

答案 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>]+/
  1. 它使用#与其中一个结尾字符之间的捕获组,以便split在结果中返回相同的捕获文本
  2. 它使用交替来允许拆分由endsWith数组定义的给定字符之一。
  3. 然后将其用作:

    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)