1

I want to use regular expression for error message...

try {
  throw new Error("Foo 'bar'");
} catch (err) {
  console.log(getInQuotes(err));
}

... where getInQuotes is a function for string:

var getInQuotes = function(str) {
  var re;
  re = /'([^']+)'/g;
  return str.match(re);
};

... but got error:

Object Error: Foo 'bar' has no method 'match'

Although it works for usual string:

console.log(getInQuotes("Hello 'world'"));

result:

[ '\'world\'' ]

Tried to stringify Error object ...

console.log("stringify: " + JSON.stringify(err));

... but it's empty:

stringify: {}
4

4 回答 4

1

您创建了一个错误对象,它不是一个字符串。但是您可以通过调用它的方法来简单地解决这个问题toString,并对结果应用匹配:

function getInQuotes(err) {
  var re;
  re = /'([^']+)'/g;
  return err.toString().match(re);
};
于 2013-06-28T11:50:01.167 回答
1

基本上,我们在这里尝试获取带注释的字符串。如果我们使用正则表达式,那么如果确实需要,我们需要一个正确的案例。

如果没有,下面的字符串替换将是更简单的解决方案。

// Arrow Function read given string and strip quoted values.
// Basic example
const getInQuotes = (str) => str.replace( /^[^']*'|'.*/g, '' );

为了让它更通用。下面的函数有助于保持这个注释器(')是可配置的。下面的代码是最新的 ES2021 代码。

  1. 这在 RegExp 函数中使用模板文字。
  2. 注释器是可配置的
  3. 更改有意义getInQuotes的方法名称。getAnnotatedStrings
  4. 方法总是返回数组,以使其保持可预测性并避免其他错误。
  5. 最好不要传递整个对象,因为它只需要错误消息。
function getAnnotatedStrings(errorMessage, annotator = "'") {
  if (!annotator || !errorMessage) return []

  const regex = new RegExp(`${annotator}([^']+)${annotator}`, 'g')
  return errorMessage.toString().match(regex);
}

实际在 ES2021 代码中。

try {
  throw new Error("Foo 'bar'");
} catch (e) {
  console.log(getAnnotatedStrings(e?.message)); // outputs - bar
}

参考: Error Object Intro
Regex Functions and Basics
Template Literals

于 2013-06-28T11:56:55.897 回答
0

err不是字符串它是一个Error对象,所以它没有.match()功能。您应该使用Error对象的toString()方法调用该函数,就这样:

try {
    throw new Error("Foo 'bar'");
} 
catch (err) {
    console.log(getInQuotes(err.toString())); 
}
于 2013-06-28T11:51:01.087 回答
0

试试这个http://jsfiddle.net/B6gMS/1/

getInQuotes(err.message)
于 2013-06-28T11:53:42.727 回答