Javascript Regexp和“;字符串文字“;

Javascript Regexp and "string literal"

本文关键字:文字 字符串 Regexp Javascript      更新时间:2023-09-26

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

我有Regexp:/([^'s"]+)|"([^'s"]+)"/g。我想匹配单个单词,如echowyświetljd923h90asd8。此外,我想匹配"字符串文字"——类似于"this is a string""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""]。我想制作一个Regexp,它将从该输入返回["echo", "abc", "abc def", "ghi"]

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

/([^'s"]+)|"([^"]*)"/g 
这是唯一可能的解释。即使不看任何代码。

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

附言:由于您的RegEx是"或"RegEx,group(1)group(2)永远不会同时拥有这两个内容。其中一个、另一个或两者都将为null或为空。后面没有对手的时候。

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

  1. 通过一些"后处理"将"从字符串中移除,并将其放入结果数组中
  2. 不要使用JavaScript的match方法,而是创建自己的等效方法(根据其中的情况使用group(1)group(2)
  3. 更改正则表达式以将引号匹配为零宽度正lookahead和lookbehinds。不确定JavaScript是否支持,但应该是/([^'s"]+)|(?<=")([^'s"]+)(?=")/g

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

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

为了解释这一点:您要么寻找未加引号的单词字符,要么将引号与中间的任何字符匹配(例如,引号应该正确匹配,例如:使用regex backreference的"it's his dog")。

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

"my '"complex'" string"

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

http://regexr.com/3bdbi