首页 > 解决方案 > 如何通过从旧字符串中删除与正则表达式不匹配的任何内容来创建新字符串(在 JavaScript 中)

问题描述

我有一个用于匹配输入中的 IMDB ID 的正则表达式,就像这样

const reg = /(tt[0-9]{7,8})/

输入可以是来自 IMDB 的任何链接,例如

https://www.imdb.com/title/tt0468569/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=e31d89dd-322d-4646-8962-327b42fe94b1&pf_rd_r=2K0PR4FAVS54AC50131G&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_4

我想要做的是从这个输入中创建一个新字符串,只留下 ID。

所以预期的输出是tt0468569

我只能找到如何删除与正则表达式匹配的所有内容的示例这与我所需要的相反。

我想要类似的东西

const reg = /(tt[0-9]{7,8})/

var input = "https://www.imdb.com/title/tt0468569/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=e31d89dd-322d-4646-8962-327b42fe94b1&pf_rd_r=2K0PR4FAVS54AC50131G&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_4"

var result = input.replace(!reg, '')

console.log(result)

任何帮助,将不胜感激

标签: javascriptstring

解决方案


这会做:

\d一个数字。您可以选择\d{7,8}or \d+which 表示 1 或更多,也可以使用\d{7,}to 表示 7 或更多。

这是文档match()

const s = "https://www.imdb.com/title/tt0468569/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=e31d89dd-322d-4646-8962-327b42fe94b1&pf_rd_r=2K0PR4FAVS54AC50131G&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_4"

console.log(s.match(/tt\d{7,8}/)[0]);

而且我们还可以防范未找到的情况:

const s = "https://www.imdb.com/title/tt0468569/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=e31d89dd-322d-4646-8962-327b42fe94b1&pf_rd_r=2K0PR4FAVS54AC50131G&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_4"

// to guard against "not found":

const matches = s.match(/tt\d{7,8}/);
const id = matches && matches[0];
console.log(id);

// Example when "not found"

const matches2 = s.match(/tt\d{20}/);
const id2 = matches2 && matches2[0];

console.log(id2);

的部分matches && matches[0],它意味着如果matches是真的(一个数组是真的),然后评估第二部分并取它的值。但是当没有匹配时,则matchesisnull和是 falsy,然后&&将不会继续,而只是将 thenull作为值。

您正在尝试匹配某些东西,因此您可能不会使用replace(),但如果您这样做,它是:

const s = "https://www.imdb.com/title/tt0468569/?pf_rd_m=A2FGELUUNOQJNL&pf_rd_p=e31d89dd-322d-4646-8962-327b42fe94b1&pf_rd_r=2K0PR4FAVS54AC50131G&pf_rd_s=center-1&pf_rd_t=15506&pf_rd_i=top&ref_=chttp_tt_4"

console.log(s.replace(/.*?(tt\d{7,8}).*/, '$1'));

表示任意数量的.*?字符且非贪婪,以便匹配第一次出现的tt_______. 如果是.*,那是贪婪的,并且括号中的模式可以匹配第二次或最后一次出现的 ,tt_______如果它存在的话。所以基本上匹配该模式并替换为第一个带括号的匹配。


推荐阅读