我想使用RegEx和JS:在括号后选择一个单词
我有一本标签词典:
Tags= ['Tag1', 'Tag2', 'Tag3', 'Tag4', 'Tag5']
我有一个数据库请求,它为我提供了一个字符串。我需要在以下条件下使用Regex从字符串中选择某些值:
-
我想选择[X](括号中的字母X(后面的单词(包括ä,ë,ü,ö(,但不选择后面的单词:
- [UnRelatedTag][X]日落[Y]海滩[Tag1][UnrlatedTag][UnlatedTag]
- 预期输出:日落
- [UnRelatedTag][X]日落[Y]海滩[Tag1][UnrlatedTag][UnlatedTag]
-
我想选择字典变量中某个标签后面的单词或单词(包括ä,ë,ü,ö(,即使中间有其他括号:
- [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]雪球--预期产出:雪球
- 最终结果将在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/这也将起到指导作用。