0

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

我有正则表达式:/([^\s"]+)|"([^\s"]+)"/g。我想匹配单个单词,例如echo, wyświetl, jd923h90asd8。另外,我想匹配“字符串文字”——比如"this is a string"or "f82h3 23fhn aj293 dgja3 xcn32"

match在输入字符串上使用方法来获取所有匹配的数组。但问题是:当 Regexp 匹配“字符串文字”并将字符串返回到数组时,该字符串包含双引号。我不想要双引号,但问题是 - 为什么 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""]。我想做一个正则表达式,从那个输入中返回["echo", "abc", "abc def", "ghi"].

4

3 回答 3

4

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

/([^\s"]+)|"([^"]*)"/g 
于 2013-08-27T09:22:13.777 回答
3

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

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

PS:由于您的 RegEx 是“或”RegEx,group(1)因此group(2)永远不会同时具有两个内容。一个、另一个或两者都将为空或为空。没有匹配的时候。

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

  1. "通过一些“后处理”从字符串中删除s,并将它们放在结果数组中。
  2. 不要使用 JavaScript 的match方法,而是创建自己的等效方法(并根据其中的情况使用group(1)或)。group(2)
  3. 更改您的正则表达式以将引号匹配为零宽度正前瞻和后视。不确定 JavaScript 是否支持此功能,但应该支持/([^\s"]+)|(?<=")([^\s"]+)(?=")/g
于 2013-08-27T09:19:41.943 回答
0

匹配 JavaScript 字符串文字。这是您要查找的内容:

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

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

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

"my \"complex\" string"

看起来你并不担心最后一种情况。

http://regexr.com/3bdbi

于 2015-07-16T13:51:00.653 回答