【问题标题】:How to match search terms within quotes如何匹配引号内的搜索词
【发布时间】:2016-12-13 16:58:05
【问题描述】:

我正在尝试解析搜索词。搜索词是一个长字符串,例如:

label:none author:@root label:~"To+Do" label:~'"test me"' label:~"No Label" label:~'won"t fix' this is a search term

我正在尝试将其解析为单独的键值对:

[{label: "none"}, {author:"@root"}, {label:"~\"To+Do\""}, {label: "~"test me\""}, {label: "~\"No Label\""}, {label: "~won\"t fix"}, {search: "this is a search term"}]

搜索词是最后一个没有键的项目。如果搜索词有空格,则用引号括起来。

我开始解析这个:

(label:.*?|author:.*?|milestone:.*?)

我不确定这是否可行,但我也对如何获取最后一个搜索词感到困惑。甚至不确定这是否可能。

最大的问题是引用的东西,我不确定如何匹配引用的东西。最后,我要做的是用空格分割字符串,同时忽略空格周围的引号。

我使用@ 作为作者,~ 作为标签,% 作为里程碑。

【问题讨论】:

  • 我不明白您的实际需求是什么:当然我们可以轻松地从您展示的第一个结构“转录”到第二个结构,但是这里的 search 有什么问题?跨度>
  • @cFreed 我更新了问题。
  • 你的一个长字符串不是字符串,有''和""
  • @Mr.Bruno 你必须正确地逃脱它。或使用 ``

标签: javascript regex string search


【解决方案1】:

这似乎可行...我还将输出结构转换为更易于使用的结构:

term = `label:none author:@root label:~"To+Do" label:~'"test me"' label:~"No Label" label:~'won"t fix' this is a search term`

re = /(\w+):([~%@]?)(?:"(.*?)"|'(.*?)'|(\S+))/g;

opts = [];

term = term.replace(re, function (_, prop, operator, v1, v2, v3) {
    opts.push({prop, operator, value: v1 || v2 || v3});
    return '';
});

opts.push({search: term.trim()});

console.log(opts);

【讨论】:

  • 这令人印象深刻。我用我使用的其他一些语法符号更新了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2018-06-07
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多