Javascript Regexp和“字符串文字”

时间:2013-08-27 09:09:38

标签: javascript regex string

我正在制作JS“命令行”模拟器。

我有Regexp:/([^\s"]+)|"([^\s"]+)"/g。 我希望匹配单个字词,例如echowyświetljd923h90asd8。另外,我想匹配“字符串文字” - 类似"this is a string""f82h3 23fhn aj293 dgja3 xcn32"

我在输入字符串上使用match方法来获取所有匹配项的数组。但问题是: 当Regexp匹配“string literal”并将字符串返回到数组时,此字符串包含双引号。我不想要双引号,但问题是 - 为什么Regexp包含双引号?在Regexp中,引号""被排除在()组之外。为什么Regexp包含所有内容?

编辑:

var re = /([^\s"]+)|"([^\s"]+)"/g;

var process = function (text) {
    return execute(text.match(re));
}

var execute = function (arr) {
    console.log(arr);
    try {
        //... apply a function with arguments...
    } catch (e) {
        error(arr[0]+": wrong function");
        return "";
    }
}

对于输入echo abc "abc def" "ghi",Regexp返回数组["echo", "abc", "abc", "def", ""ghi""]。 我想创建一个Regexp,从该输入返回["echo", "abc", "abc def", "ghi"]

3 个答案:

答案 0 :(得分:3)

正则表达式的引用部分("([^\s"]+)")不允许引号中的空格。尝试从中删除\s。如果您需要匹配空字符串(*),还可以考虑使用+代替""

/([^\s"]+)|"([^"]*)"/g 

答案 1 :(得分:2)

这是唯一可能的解释。即使不查看任何代码。

使用group(1)group(2)。不是group()group(0)。后两个(完全等效)总是返回整个匹配的字符串,在您的情况下包括引号。我希望这可以解释发生了什么。

PS:由于您的RegEx是“或”RegEx,group(1)group(2)将永远不会同时拥有这两个内容。一个,另一个或两者都将为null或为空。后来没有比赛时。

我刚刚意识到你正在使用match方法将所有匹配作为数组检索。在这种情况下,我要说这个方法总是在每种情况下捕获整个匹配的字符串(相当于上面的group(0))。没有办法告诉它检索其他组(如1或2)。因此,您有3种选择:

  1. 通过一些“后处理”,在结果数组中删除带有它们的" s。
  2. 不要使用JavaScript的match方法,而是创建自己的等效方法(根据案例使用group(1)group(2))。
  3. 更改正则表达式以匹配引号为零宽度正向前瞻和后视。不确定JavaScript是否支持此功能,但它应该是/([^\s"]+)|(?<=")([^\s"]+)(?=")/g

答案 2 :(得分:0)

匹配JavaScript字符串文字。以下是您正在寻找的内容:

/(\w+|("|')(.*?)\2)/g

要解释这一点:您要么寻找不带引号的单词字符,要么将引号与之间的任何内容匹配(例如引号应该正确匹配,例如:"it's his dog"使用正则表达式反向引用)。

这被简化为警惕,它不匹配转义字符串,如:

"my \"complex\" string"

看起来你并不担心最后一个场景。

http://regexr.com/3bdbi