检测逻辑表达式字符串中的标签

Detect tags in a logical expression string

描述:

在我的 Javascript 代码中,我有一个逻辑表达式 字符串 ,如下例所示:

'foo && !bar || baz'

其中 foobarbaz 是我应用中一些标签的名称。

标签可以包含小写字母、大写字母、数字和特殊字符(+、-、*、# 等)。所以下面的字符串可能是有效的标签: foo-bar, foo#, f*oo.

可能的逻辑运算符是:||(或)、&&(与)和!(非)。

要求:

我只需要从上面的字符串中获取标签,作为一个数组:

['foo', 'bar', 'baz']

我试过的代码: 我尝试使用正则表达式 /&&|\|/ 来获取逻辑运算符,然后尝试反转逻辑表达式,但没有成功。

其他例子:

foo && bar => 预期结果 ['foo', 'bar']

foo1 || bar1 => 预期结果 ['foo1', 'bar1']

foo+ && !bar& => 预期结果 ['foo+', 'bar&']

foo && bar || baz => 预期结果 ['foo', 'bar', 'baz']

您可以像这样分两步构建您的解决方案:

  1. 使用替换删除使用 /(?:\|\||&&|\B!)/g
  2. 的运算符
  3. 用空格分割剩余的字符串

const arr=['foo! && bar',
'foo1 || bar1',
'foo+ && !bar&',
'foo && bar || baz']

const re = /(?:\|\||&&|\B!)/g

res = []
arr.forEach(el => res.push(el.replace(re, "").split(/\s+/)))

console.log(res)

正则表达式 (?:\|\||&&|\B!) 匹配不在单词字符之后的 ||&&!

您可以简单地拆分运算符:

var text = 'foo && bar& || !baz';
var regex = / *(?:&&|\|\||!) */;
var tags = text
  .split(regex)     // split on operators
  .filter(Boolean); // filter out empty items
console.log('text: ' + text);
console.log('tags: ' + JSON.stringify(tags));

输出:

text: foo && bar& || !baz
tags: ["foo","bar&","baz"]

此测试输入涵盖了连续运算符(||!)的极端情况,以及作为标签名称一部分的单个 &

用于拆分的正则表达式说明:

  • * - 期望可选 space
  • (?:&&|\|\||!) - 后跟所有的或运算符; (?:...) 是非捕获组(拆分结果数组中包括捕获的组)
  • * - 后跟可选的 spaces