我正在制作JS“命令行”模拟器。
我有Regexp:/([^\s"]+)|"([^\s"]+)"/g
。
我希望匹配单个字词,例如echo
,wyświetl
,jd923h90asd8
。另外,我想匹配“字符串文字” - 类似"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"]
。
答案 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种选择:
"
s。match
方法,而是创建自己的等效方法(根据案例使用group(1)
或group(2)
)。/([^\s"]+)|(?<=")([^\s"]+)(?=")/g
答案 2 :(得分:0)
匹配JavaScript字符串文字。以下是您正在寻找的内容:
/(\w+|("|')(.*?)\2)/g
要解释这一点:您要么寻找不带引号的单词字符,要么将引号与之间的任何内容匹配(例如引号应该正确匹配,例如:"it's his dog"
使用正则表达式反向引用)。
这被简化为警惕,它不匹配转义字符串,如:
"my \"complex\" string"
看起来你并不担心最后一个场景。