【问题标题】:RegExp equivalent of array.indexOf( str )正则表达式等价于 array.indexOf(string)
【发布时间】:2012-01-07 04:09:56
【问题描述】:

给定一个包含字符串值的变量str,这两行代码是否等效?

A 行:

if ( [ 'foo', 'bar', 'baz' ].indexOf( str ) > -1 ) {

B 行:

if ( /^foo|bar|baz$/.test( str ) ) {

【问题讨论】:

标签: javascript regex theory


【解决方案1】:

好的,在编辑之后,它们仍然不等价,因为 test 将调用 toString。见:

var myItem = {toString: function() { return 'foo'; }};

['foo', 'bar', 'baz'].indexOf(myItem); // -1
/^(foo|bar|baz)$/.test(myItem); // true

http://jsfiddle.net/hqu7D/

即使它们是字符串值(抱歉,错过了),它们仍然不等价,因为有两种不同类型的字符串并且indexOf 使用严格的相等/身份:

http://jsfiddle.net/HpCUY/

要使它们真正等效,您可以在使用indexOf 之前调用.toString(),或者在使用test 之前测试Object.prototype.toString.call(myItem) === '[object String]'

【讨论】:

  • 它们还是不同的。 Minitech 为您提供了一些 B 将捕获而 A 不会捕获的示例,并查看我为您提供的正则表达式以了解如何修复它。
  • @minitech 是的,但我在我的问题中提到str 是一个字符串值......它不能是一个对象。
  • @ŠimeVidas:抱歉,错过了。我再次编辑了我的答案 - 他们是still not equivalent
  • @minitech 呃...:) 当我说“字符串值”时,我指的是字符串类型的值,而不是字符串对象...(字符串对象没用,我永远不会使用它们...)
  • @ŠimeVidas:我知道 :) 但是你的问题被标记为theory,这是一种可能性。 jQuery 也可以。
【解决方案2】:

不,他们不是。

方法indexOf()返回-1如果在数组中没有找到,或者如果在数组中找到数组的位置。

如果正则表达式找到匹配项,test 方法返回 true,否则返回 false

如果您的正则表达式改为/^(foo|bar|baz)$/,那么函数将是相同的。

【讨论】:

  • 但是为什么需要括号呢?
  • @ŠimeVidas 因为/^foo|bar$/^foobar$,因此会匹配“傻瓜”,也会匹配“沙洲”。
【解决方案3】:

不完全是。管道包括^$ 作为替代品。我对 JS 的正则表达式的语法不是很清楚,但是如果您要查找的 str 只包含 foo,或 bar,或 baz,请使用表达式 /^(foo|bar|baz)$/。如果您想做一些不同的事情,请告诉我,我会尽力解决。

【讨论】:

  • 我想用 Line B 实现 Line A 的行为。(所以,是的,我想检查 str 是否正是这三个值之一......)
  • 那么是的,你想要我给你的正则表达式。或者,如果您不需要捕获匹配的 /which/ 值,则可以使用/^(?:foo|bar|baz)$/?: 的意思是“不要费心记住这三个匹配中的哪一个”,它可能会快一点
  • 您能解释一下为什么我必须将我的a|b|c 分组吗?它有什么不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2011-08-24
  • 2012-06-19
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多