我正在尝试清除 YouTube 视频标题中不必要的单词,例如“官方视频”、“音频”、“音乐视频”等。我需要帮助构建可以使用的正则表达式。到目前为止,我尝试过:
const regex = /\s*[-\(\[]?\s*(-|official|video|audio|lyrics|lyric|hd|full|4k|music\s+video|\d{4})\s*[\)\]]?$/gi;
据我了解,这只会删除最后一次出现的关键字。我所做的是在这样的循环中使用它:
function clearSearchTerm(title) {
const regex = /\s*[-\(\[]?\s*(-|official|video|audio|lyrics|lyric|hd|full|4k|music\s+video|\d{4})\s*[\)\]]?$/gi;
let newTitle;
do {
newTitle = title;
title = title.replace(regex, "");
} while (newTitle !== title);
return title;
}
目前它对我来说是有效的,因为我没有找到任何它不起作用的例子。评论中提到的是,我以前的正则表达式会删除出现在标题中间的关键字,我猜这个问题已经解决了。如果你知道如何改进这一点,我洗耳恭听。在下一部分中,我将写一些我需要删除的示例。
我想要删除的单词如下:
Audio
Video
Lyrics
Official
Remaster
2020 (or years in general)
...
所有这些词(可能还有更多)都可以出现在(
and之间)
或[
and之间]
或之后-
。这些词可以组合在一起,例如:Some title - Official Video
which should be cleaned to beSome title
等等。
使用 PCRE(通常在 PHP 中),您可以通过声明子模式来避免单词重复,然后在主模式中重复使用它。还可以使用 x标志添加注释和空格以提高可读性:
查看其实际作用和解释:https://regex101.com/r/kPeYzb/1
如果您必须坚持使用 JavaScript 引擎,则必须删除空格、注释并复制粘贴单词的模式,从而得到相同的模式,具有 JavaScript 风格:
具体操作如下:https://regex101.com/r/kPeYzb/2
现在,关于避免在正则表达式中输入两次此单词列表的问题,可以使用
RegExp()
构造函数从字符串创建正则表达式。这意味着您可以从配置中获得一个单词数组(或单词正则表达式):此正则表达式将匹配
,后跟任意单词
-
或[
或(
后跟任意数量的文字空格OFFICIAL VIDEO|REMASTER|LYRICS|AUDIO
或四位数字,后跟任意数量的空格,后跟匹配的右括号(当适用时)。REGEX 模式(ECMAScript(JavaScript)风格)(标志:gmi):
正则表达式演示: https://regex101.com/r/Wy2I0w/8 (10 个匹配)
笔记:
(|\[(?:(?<=\[)(?= *[^\]\n]* *\])))
(?:
打开非捕获组(?:...)
交替(...|...|...)
语句。匹配交替语句中由竖线 (|
) 分隔的元素之一。-
匹配文字破折号-
(第一个选项)|
替代元素分隔符。后跟第二个选项。\(
匹配文字(
(?:
开始非捕获组(?:...)
(第二个选项)(?<=
开始后视(?<=...)
检查是否打开(
。\(
匹配文字(
。此字符必须位于此索引点之前。)
仔细后视。(?=
开始前瞻(?=...)
以确保有匹配的结束符)
。不会消耗字符。*
匹配 0 个或多个 (*
) 文字空格[^)\n]+
否定捕获类[^...]
匹配任何不是)
或换行符 的字符\n
1 次或多次(+
)。*
匹配 0 个或多个 (*
) 文字空格\)
匹配文字)
。)
关闭前瞻。)
关闭非捕获组(第二种选择)|
替代元素分隔符。后跟第三个选项。\[
匹配文字[
。(?:
开始非捕获组(?:...)
(第三个选项)(?<=
开始回顾(?<=...)
检查是否打开。\[
匹配文字[
。)
关闭*回顾。(?=
开始向前查找匹配的结束括号]
。不会消耗字符。*
匹配0个或多个文字空格[^\]\n]+
否定字符类匹配任何不是]
或换行符 的字符\n
一次或多次 (+
)。*
匹配文字空格\]
匹配文字]
。)
关闭前瞻。)
关闭非捕获组。)
关闭交替组。*
匹配0个或多个文字空格(?:
开始包含交替的非捕获组。OFFICIAL VIDEO|REMASTER|LYRICS|AUDIO|\d{4}
交替匹配列出的单词之一或四位数字\d{4}
(年份)。)
关闭非捕获组。\s*
匹配0个或更多空白字符\s
。(?:
打开包含交替的非捕获组。\]|\)
匹配文字]
或 文字)
。)?
关闭交替组。使其成为可选的 (?
)。(?=
开始前瞻,不会消耗字符。|\n|$
匹配文字空格字符\n
或行尾$
。)
关闭前瞻。测试字符串:
结果: