Regex可在方括号后选择一个或多个单词



我想使用RegEx和JS:在括号后选择一个单词

我有一本标签词典:

Tags= ['Tag1', 'Tag2', 'Tag3', 'Tag4', 'Tag5']

我有一个数据库请求,它为我提供了一个字符串。我需要在以下条件下使用Regex从字符串中选择某些值:

  1. 我想选择[X](括号中的字母X(后面的单词(包括ä,ë,ü,ö(,但不选择后面的单词:

    • [UnRelatedTag][X]日落[Y]海滩[Tag1][UnrlatedTag][UnlatedTag]
      • 预期输出:日落
  2. 我想选择字典变量中某个标签后面的单词或单词(包括ä,ë,ü,ö(,即使中间有其他括号:

  • [UnRelatedTag][X]日落[Y]海滩[Tag1][UnrlatedTag][UnlatedTag]--预期输出:a
  • [UnRelatedTag][X]日落[Y]海滩[Tag1][UnrlatedTag]彩弹[Unrlatedtag][UnlatedTag][UnRelatedTag]--预期输出:彩弹
  • [UnRelatedTag][X]日落[Y]海滩[Tag1][UnrlatedTag]彩弹[Unrlatedtag][UnlatedTag][UnRelatedTag]游艇--预期输出:彩弹,游艇
  • [UnRelatedTag][X]日落[Y]海滩[Tag1]雪球--预期产出:雪球
  1. 最终结果将在JS中使用,将[X]后的单词和[Tag]后的单个/多个单词连接成一个字符串

感谢的帮助

以下是根据您的规范提取单词的示例输入字符串和代码:

const strings = [
'[UnRelatedTag][X]sunset[Y]beach[Tag1][UnrelatedTag]a[UnrelatedTag][UnrelatedTag][UnrelatedTag]',
'[UnRelatedTag][X]sunset[Y]beach[Tag1][UnrelatedTag]paintball[UnrelatedTag][UnrelatedTag][UnrelatedTag]',
'[UnRelatedTag][X]sunset[Y]beach[Tag1][UnrelatedTag]paintball[UnrelatedTag][UnrelatedTag][UnrelatedTag]yacht',
'[UnRelatedTag][X]sunset[Y]beach[Tag1]snowball'
];
const tags = ['Tag1', 'Tag2', 'Tag3', 'Tag4', 'Tag5'];
const regex1 = new RegExp('\[X\]([\wäëüö]+).*?\[(?:' + tags.join('|') + ')\](.*)', 'i');
const regex2 = /[[^]]*]/;
strings.forEach(str => {
let result = [];
let m = str.match(regex1);
if(m) {
result.push(m[1]);
m[2].split(regex2).filter(Boolean).forEach(s => {
result.push(s);
});
}
console.log(str + 'n ==> ' + result.join(', '));
});
输出:

[UnRelatedTag][X]sunset[Y]beach[Tag1][UnrelatedTag]a[UnrelatedTag][UnrelatedTag][UnrelatedTag]
==> sunset, a
[UnRelatedTag][X]sunset[Y]beach[Tag1][UnrelatedTag]paintball[UnrelatedTag][UnrelatedTag][UnrelatedTag]
==> sunset, paintball
[UnRelatedTag][X]sunset[Y]beach[Tag1][UnrelatedTag]paintball[UnrelatedTag][UnrelatedTag][UnrelatedTag]yacht
==> sunset, paintball, yacht
[UnRelatedTag][X]sunset[Y]beach[Tag1]snowball
==> sunset, snowball

说明:

  • regex1
    • 基于标签数组动态构建
    • 两个捕获组,一个用于标记[X]之后的单词,另一个用于标签数组中标记之后的所有文本
  • 如果匹配:
    • 第一个捕获组被添加到结果中
    • 所述第二捕获组:
      • 在标签模式[上被拆分。。。]
      • .filter(Boolean)过滤掉空字符串
      • 你可以通过感兴趣的单词模式进一步筛选
      • 每个拆分项都添加到结果中
  • 使用所需的任意分隔符加入结果数组,此处为,

只需取左边界(.*?(右边界

示例:[X](.*?(\W[Y]:用于日落

你可以使用https://regex101.com/这也将起到指导作用。

最新更新