检测逻辑表达式字符串中的标签
Detect tags in a logical expression string
描述:
在我的 Javascript 代码中,我有一个逻辑表达式 字符串 ,如下例所示:
'foo && !bar || baz'
其中 foo
、bar
和 baz
是我应用中一些标签的名称。
标签可以包含小写字母、大写字母、数字和特殊字符(+、-、*、# 等)。所以下面的字符串可能是有效的标签:
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']
您可以像这样分两步构建您的解决方案:
- 使用替换删除使用
/(?:\|\||&&|\B!)/g
的运算符
- 用空格分割剩余的字符串
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
描述:
在我的 Javascript 代码中,我有一个逻辑表达式 字符串 ,如下例所示:
'foo && !bar || baz'
其中 foo
、bar
和 baz
是我应用中一些标签的名称。
标签可以包含小写字母、大写字母、数字和特殊字符(+、-、*、# 等)。所以下面的字符串可能是有效的标签:
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']
您可以像这样分两步构建您的解决方案:
- 使用替换删除使用
/(?:\|\||&&|\B!)/g
的运算符
- 用空格分割剩余的字符串
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