只有当它们不包含在子字符串中时才用正则表达式分隔空格

时间:2014-02-05 18:19:57

标签: javascript regex string function split

我应该用空格(或\ r \ n \ t)分割一个可能包含子串的字符串

示例:

text 'contained in' a string

我尝试使用正则表达式:

/[?<!\"\'](\ )*[?!\"\']/g;

string.split(regex)应返回:

["text", "'contained in'", "a", "string"]

但是这是错的......我在很长时间内解决它:@

现在,我创建了一个split函数,如果有超出子串的话,会自动用sepchar分割,但是我正在寻找一个带正则表达式的简单解决方案,如果可能的话,显然:P

4 个答案:

答案 0 :(得分:2)

尝试/([\'\"][^\"\']+[\'\"])|([^\s]+)/g,简单但工作正常。

http://regex101.com/r/hR3bQ8/

您只能使用/([\'\"][^\"\']+[\'\"])/g提取子字符串。

答案 1 :(得分:1)

看起来你尝试使用这样的外观:

/(?<!\"\')(\ )*(?!\"\')/

但是,JavaScript不支持lookbehinds((?<=...)(?<!...)),因此您需要一个不同的策略。您要拆分的模式中的任何捕获组都将在结果数组中返回,因此像这样拆分将使您接近所需的结果:

var input = "text 'contained in' a string";
var output = input.split(/('[^']*')|\s/);
console.log(output); // ["text", undefined, "", "'contained in'", "", undefined, "a", undefined, "string"]

现在唯一的问题是你对那些undefined和空字符串做了什么?您可以使用ES5中的filter方法,如下所示:

var input = "text 'contained in' a string";
var output = input.split(/('[^']*')|\s/).filter(function(s) { return s && s.length; });
console.log(output); // ["text", "'contained in'", "a", "string"]

答案 2 :(得分:1)

你可以这样做:

(?:'(.*)'|(\b[\w]+\b))

工作正则表达式示例:

http://regex101.com/r/oJ2nQ9

甚至更好,而不是使用单词bounderies(因为你的字符串可能包含特殊字符)..这会更好:

(?:'(.*?)'|(?:[\s]*|^)([^\s]+)(?:[\s]*|$))

示例字符串:

text 'contained in' a string-with special's chars.

匹配

"text", "contained in", "a", "string-with", "special's", "chars."

工作正则表达式示例:

http://regex101.com/r/iP3iJ1

答案 3 :(得分:1)

您可以在Javascript中使用它:

var s="text 'contained in' a string";
s.split(/ +(?=(?:(?:[^']*'){2})*[^']*$)/g);
//=> ["text", "'contained in'", "a", "string"]

Regex基本上使用前瞻来确保空格后面有偶数引号。