2 回答
TA贡献1796条经验 获得超4个赞
试试这个正则表达式:([a-zA-Z]+[a-zA-Z0-9_]+)(?<![and|or|not]). 我刚刚更新了您的代码中的正则表达式,请测试并让我知道您是否有任何疑问。
const paragraph = '(Value1==6) and (Value2==0)?1:0';
const regex = /([a-zA-Z]+[a-zA-Z0-9_]+)(?<![and|or|not])/g;
const found = paragraph.match(regex);
console.log(found);
TA贡献1827条经验 获得超9个赞
您更新的问题完全改变了输入的性质。如果输入如此不同,您将需要匹配任何不以 、 或 以外的数字开头的“单词” and
(or
但这not
符合您最初的尝试,所以我想这是有道理的) :
const regex = /(?!and|or|not)\b[A-Z]\w*/gi;
实例:
const tests = [
{
str: "(Value1==6) and or not (Value2==0)?1:0",
expect: ["Value1", "Value2"]
},
{
str: "Value_1",
expect: ["Value_1"]
},
{
str: "(Value_1 * Value_2)",
expect: ["Value_1", "Value_2"]
},
{
str: "Value_Machine_Outcome==4?1:0",
expect: ["Value_Machine_Outcome"] // Note I put this in an array
}
];
const regex = /(?!and|or|not)\b[A-Z]\w*/gi;
for (const {str, expect} of tests) {
const result = str.match(regex);
const good = result.length === expect.length && result.every((v, i) => v === expect[i]);
console.log(JSON.stringify(result), good ? "Ok" : "<== ERROR");
}
其工作原理是不允许and
、or
、 和not
,并要求在单词边界 ( \b
) 处进行匹配。请注意,在测试中,我将Value_Machine_Outcome==4?1:0
字符串的预期结果更改为数组,而不仅仅是字符串,就像所有其他结果一样。
问题完全改变输入之前的原始答案:
如果你想使用String.prototype.match
,你可以对 a 使用正向后视(自 ES2018 起)(
并匹配 a 之前的所有内容=
:
const regex = /(?<=\()[^=]+/g;
实例:
const paragraph = '(Value1==6) and (Value2==0)?1:0';
const regex = /(?<=\()[^=]+/g;
const found = paragraph.match(regex);
console.log(found);
// expected output: Array ["Value1", "Value2"]
如果您同意循环,则可以通过使用捕获组来避免后向查找(因为它们仅在 ES2018 中添加):
const regex = /\(([^=]+)/g;
const found = [];
let match;
while (!!(match = regex.exec(paragraph))) {
found.push(match[1]);
}
实例:
const paragraph = '(Value1==6) and (Value2==0)?1:0';
const regex = /\(([^=]+)/g;
const found = [];
let match;
while (!!(match = regex.exec(paragraph))) {
found.push(match[1]);
}
console.log(found);
// expected output: Array ["Value1", "Value2"]
在评论中你问:
我的表达式也可以包含下划线。就像它可以是 value_1、value_2 一样。那里能行得通吗?
我说会是因为上面的两个都匹配除了=
.
后来你说:
当我的结构包含“Value_1”时它会忽略
同样,以上两者都可以与Value_1
和配合使用Value_2
:
第一的:
const paragraph = '(Value_1==6) and (Value_2==0)?1:0';
const regex = /(?<=\()[^=]+/g;
const found = paragraph.match(regex);
console.log(found);
// expected output: Array ["Value1", "Value2"]
第二:
const paragraph = '(Value_1==6) and (Value_2==0)?1:0';
const regex = /\(([^=]+)/g;
const found = [];
let match;
while (!!(match = regex.exec(paragraph))) {
found.push(match[1]);
}
console.log(found);
// expected output: Array ["Value1", "Value2"]
添加回答
举报