Javascript 根据特定字符获取整个字符串或子字符串

Javascript 根据特定字符获取整个字符串或子字符串,javascript,regex,node.js,string-comparison,Javascript,Regex,Node.js,String Comparison,我有一个包含MIME类型的字符串,比如application/json。现在,我想将其与实际的HTTP头进行比较,在本例中为内容类型 如果标头包含MIME类型,那么它很容易: if (mimeType === contentType) { ... } 不幸的是,标题可能包含其他参数。它们总是跟在我感兴趣的值后面,它们之间用一个隔开。例如,它可以是application/json;字符集=UTF-8 所以现在基本上我需要运行: if (mimeType === contentType.subst

我有一个包含MIME类型的字符串,比如
application/json
。现在,我想将其与实际的HTTP头进行比较,在本例中为
内容类型

如果标头包含MIME类型,那么它很容易:

if (mimeType === contentType) { ... }
不幸的是,标题可能包含其他参数。它们总是跟在我感兴趣的值后面,它们之间用一个
隔开。例如,它可以是
application/json;字符集=UTF-8

所以现在基本上我需要运行:

if (mimeType === contentType.substring(0, contentType.indexOf(';'))) { ... }
问题是第一种情况仍然可能发生,因此现在我们有:

if (mimeType === contentType ||
    mimeType === contentType.substring(0, contentType.indexOf(';'))) { ... }
事情开始变得冗长

我可以考虑使用

if (mimeType === contentType.substring(0, mimeType.length)) { ...}
但这也将成功地匹配值
应用程序/jsonformatter
(这是不需要的)

因此,长话短说:有没有比我上面描述的冗长的
if
更好的方法来比较这些值,例如使用正则表达式

基本上,我在考虑一个表达式,根据以下规则在必要时缩短标题:

  • 如果它包含分号,则返回它前面的部分
  • 如果不包含分号,则返回所有内容

写这篇文章最有效的方法是什么?

您可以使用正则表达式匹配:

if ( mimeType.match(/^application\/json(?= *;|$)/i) ) {
    // matched
}

这里的
(?=*;|$)
是正向的前瞻,它将确保搜索的字符串
application/json
后跟可选空格和
或者它是输入中唯一的字符串。

我建议使用标准解析模块,如
media typer
,Express在其中间件中使用

var typer = require('media-typer');

var obj = typer.parse(contentType);
if (obj.type === 'application' && obj.subtype === 'json'){
    // Success
}

该类型将以空格、行尾或空格结尾;感谢您指出:-)RFC允许在类型末尾和第一个
之间使用OWS例如
app/foo;k=v
实际上,我本来想找一个这样的模块,但没能找到。谢谢你的提示:-)