【问题标题】:Using regex to capture `\"` and split into array使用正则表达式捕获`\"`并拆分为数组
【发布时间】:2016-05-16 00:17:16
【问题描述】:

我遇到了一些我以前从未见过的东西,而 google 没用,因为它不断从我的搜索中删除 \"

首先,\" 是什么意思?我正在访问一个 API,对于其中一个键的值,它是一串标签,但是如果其中一个标签有两个单词,它会使用 \" 来显示标签是两个单词。下面的例子

"foo bar baz \"taz foo\" goo too loo"

我正在尝试将它们拆分成一个数组,就像["foo", "bar", "baz", "taz foo", "goo", "too", "loo"]

但是,我花了很多时间弄清楚如何捕获 \" 并制作它,以便我可以将它们拆分为像上面这样的数组。

【问题讨论】:

标签: javascript arrays regex


【解决方案1】:

使用String.prototype.replace() 获得乐趣和利润:

var s = "foo bar baz \"taz foo\" goo too loo";

var arr = [];
s.replace(/[^\s"]+|"[^"]*"/g, function($1) {
  arr.push($1.replace(/"/g,''));
});

console.log(arr); // ["foo", "bar", "baz", "taz foo", "goo", "too", "loo"]

创建一个空数组arr 以将匹配项推入
使用replace 收集$1 匹配项:任何
[^\s"]+ 不是空格或双引号(一次或无限次)
|
"[^"]*" " " 之间的任何内容不是引用[^"](零次或无限次*

【讨论】:

  • 介意解释一下你的正则表达式吗?
  • 非常感谢您的解释,现在很有意义。
【解决方案2】:

\" 表示转义双引号字符。它被称为escape character

如果要在双引号字符串中使用双精度,则必须使用转义字符。

比如说你想存储一个字符串abcd"xyz"abcd

console.log("abcd"xyz"abcd");

会给你一个错误,因为xyz之前的双引号标记字符串的结尾,xyz之后的引号标记新字符串的开头,因此由于语法不正确而发生错误。

因此,要在字符串中使用双引号,您必须

使用\" 转义双引号

console.log("abcd\"xyz\"abcd");

或将双引号放在单引号字符串中

console.log('abcd"xyz"abcd');

至于您的拆分问题,您可以在正则表达式上拆分以获得这样的数组:

> "foo bar baz \"taz foo\" goo too loo".match(/\w+|(?:")[^"]*?(?:")/g);

["foo", "bar", "baz", ""taz foo"", "goo", "too", "loo"]

然后您可以遍历数组并删除双引号,如下所示:

> '"abcd xyz"'.replace(/"/g, '');
"abcd xyz"

组合代码:

> arr="foo bar baz \"taz foo\" goo too loo".match(/\w+|"[^"]*?(?=")/g);
["foo", "bar", "baz", ""taz foo", "goo", "too", "loo"]
> for(var i=0;i<arr.length;i++){arr[i]=arr[i].replace(/"/g, '');}
> console.log(arr);
["foo", "bar", "baz", "taz foo", "goo", "too", "loo"]

【讨论】:

  • 谢谢,但问题是taz foo 应该是数组中的一个索引而不是拆分。
  • “这叫做转义序列” 不,不是。转义序列是不同的。这只是一个转义字符。阅读您发布的链接
  • @Borodin 是的 .. 我想参考 escape sequences in C 页面,但是是的 escape character 更通用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多