Regexp:返回不包含字符的匹配数组

时间:2014-04-08 11:33:25

标签: javascript regex

我想带一些带有一些特殊字符的字符串,并返回一个匹配数组,但没有分隔字符,所以字符串

somebody@place&time[with,some,people]

将返回

['某人','地点','时间','有,有些人']

我目前有

(\w+)|(@\w+)|(&\w+)|\[([\w=\|,]+)\]

我不能只拆分非字母数字字符,因为我希望有人能够提供

@place [用,一些人]

正则表达式将返回

[undefined,'place',undefined,'width,some,people']

我很确定有一种方法可以删除分离字符,但我似乎无法找到它

--------------更新----------------------------

正如@CodeJockey提到的那样,我没有指定一种语言,因为我认为这样做会更好(因为正则表达式适用于多种语言)。我特意使用javascript和string.match来返回匹配数组。

回答@ CodeJockey关于他提供的例子的其他问题

someone@area&time[] = ["someone","area","time",""]
@location = [undefined,"location",undefined, undefined]
@&tempus = [undefined, "","tempus",undefined]
@tempus?? = [undefined, "tempus??", undefined, undefined]
noone@nowhere&never[all,humans,that,ever,existed] = ["noone", "nowhere","ever","all,humans,that,ever,existed"]
savior@some undisclosed place&rapture:30[true,believers] = ["savoir","some",undefined, undefined] //as I have already cleaned the string so there are no spaces. 

在上面的例子中,未定义或空字符串并不重要,要么是可以接受的,因为我需要稍后检查。

3 个答案:

答案 0 :(得分:1)

$ php -r '$s="somebody@place&time[with,some,people]"; preg_match("/^([^@]*)@([^&]+)&([^[]+)[[]([^]]+)[]]/", $s, $a); unset($a[0]); print_r($a);'
Array
(
    [1] => somebody
    [2] => place
    [3] => time
    [4] => with,some,people
)

请注意,正则表达式的第一个元素使用*而不是+进行扩展,以允许空白"某人"你的问题的字符串。另请注意,空字符串只是空的,而不是未定义的。

答案 1 :(得分:0)

希望这可能有助于其他人。我认为我可以使用javascript中的匹配方法使用regexp执行此操作,但我认为我错了。

我现在认为这样做的正确方法是sizzle.js(jQuery的DOM查询引擎)的方式。你可以在这里找到它。 https://github.com/jquery/sizzle/blob/master/dist/sizzle.js, 寻找第110行附近的matchExpr

答案 2 :(得分:0)

使用您在响应@ghoti时引用的小提琴,I modified and fixed the expression he suggested

var to_parse = "name@place&time[with,other,people]";

var parse_array = to_parse.match(/^([^@]*)@([^&]+)&([^[]+)\[([^\]]+)\]/);

以下语句中的任何一个从索引0中删除“complete match”元素并将结果放在parse_array变量中,但只有第一个语句是可链接的......

parse_array = parse_array.splice(1,4);
parse_array.splice(0,1); 

以上的单一陈述版本是:

var parse_array = to_parse.match(/^([^@]*)@([^&]+)&([^[]+)\[([^\]]+)\]/).splice(1,4);

很好地输出结果(通过强调分隔数组项的逗号和将最后一项的字符串中包含的项分隔开的逗号之间的差异)到控制台,使用:

console.log('[\"' + parse_array.join("\", \"") + '\"]'); 

希望这可以帮助你