获取整个字符串或子字符串,具体取决于特定字符

时间:2014-11-15 16:02:17

标签: javascript regex node.js string-comparison

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

如果标题包含MIME类型,那么它就像:

一样简单
if (mimeType === contentType) { ... }

不幸的是,标题可能包含其他参数。他们总是追随我感兴趣的价值,并通过;与它分开。例如,它可以是application/json; charset=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)) { ...}

但这也会成功匹配值application/jsonformatter(这是不可取的)。

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

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

  • 如果它包含分号,请将部件返回到它之前。
  • 如果它不包含分号,请返回所有内容。

最有效的写作方式是什么?

2 个答案:

答案 0 :(得分:2)

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

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

RegEx Demo

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

答案 1 :(得分:1)

我建议使用像media-typer这样的标准解析模块,Express在其中间件中使用。

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

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