Javascript 正则表达式以获取除特定单词之外的任何单词的列表,但也可以在另一组中获取该特定单词

Javascript Regex to get list of any words except a specific word but also get that specific word in another group

我想获得水果和肉类下方示例中列出的所有类别,但不是强制性单词,但如果存在的话我仍然希望获得强制性:

categories fruit meat mandatory

我试图从 Match everything except for specified strings

中获得启发

https://regex101.com/r/peXJXx/1

/(categories )(^(?!.+(mandatory)))(mandatory)?/gis

但无法正常工作

const r = 'categories fruit meat mandatory';
const [, ...categories] = r.split(' ').filter(_ => _ !== 'mandatory');

这样的问题不需要Regex,我用split(' ')将字符串拆分成单词(转换成数组),然后从'mandatory'中过滤出来,我也用过解构 删除第一个元素。

如果您坚持使用正则表达式,这可能就是您想要的。

const input = "categories fruit meat mandatory";
const regex = /\w+/gm;
const regex2 = /^\w+/g;

const results = input.matchAll(regex);

let type = input.match(regex2)[0];

let isMandatory = false;
let isCategory = false;
let categories = [];
for (const result of results){
    switch(result[0]){
    case "categories": isCategory = true; break;
    case "mandatory": isMandatory = true; break;
    default: categories.push(result[0]);
  }
}
console.log("Type: " + type);
console.log("Categories: " + categories.join(", "));
console.log("Mandatory: " + (isMandatory ? "Yes" : "No"));
Type: categories
Categories: fruit, meat
Mandatory: Yes

你可以随心所欲地修饰它。本质上,如果您有多个输入,您将遍历每个字符串并 运行 此代码。如果您有其他类型而不是类别,您可以添加类似 isDepartment = false 的内容,然后在开关中执行 case "departments": isDepartment = true; break;.

您也可以只修改正则表达式以忽略第一个单词并创建第二个正则表达式模式来识别第一个单词具体是什么 const regex2 = /^\w+/g; 然后执行 let type = input.match(regex2)[0];.

这是一个现场样本 https://jsfiddle.net/gey3oqLp/1/

编辑:其实现在我想起来了。如果我们要走开关路线,我们不需要匹配正则表达式中的任何特定内容。我们只需要匹配每个单词并在以后处理它。我已将正则表达式更新为更简单的版本。