Javascript 正则表达式在不应该匹配逗号时匹配逗号

发布于 2024-12-11 18:10:45 字数 1058 浏览 0 评论 0原文

我无法弄清楚 Firefox 7.0.1 和 Google Chrome 14.0.835.202 中发生的这个 javascript 小奇怪现象(我没有测试过任何其他版本)。为什么 /[+-.]/g 除了匹配加号(+)、破折号()之外,还匹配逗号(,) -)和句点(.)?

// Firebug
>>> "Hello, World++--..".match(/[+-.]/g);
[",", "+", "+", "-", "-", ".", "."]
>>> "Hello, World".match(/[+-.]/g);
[","]

// Chrome Developer Tools:
> "Hello, World++--..".match(/[+-.]/g);
  [",", "+", "+", "-", "-", ".", "."]
> "Hello, World".match(/[+-.]/g);
  [","]

好吧,也许我需要转义句点 (.)

// Firebug
>>> "Hello, World!".match(/[+-\.]/g);
[","]

// Chrome Developer Tools
> "Hello, World!".match(/[+-\.]/g);
  [","]

不。但是,如果我更改加号 (+) 和破折号 (-) 的顺序,它将停止匹配逗号 (,)。

// Firebug
>>> "Hello, World".match(/[-+.]/g);
null

// Chrome Developer Tools
> "Hello, World".match(/[-+.]/g);
  null

这对我来说毫无意义。 Firefox 和 Chrome 都共享相同的正则表达式错误,这似乎很奇怪。有人知道这是为什么吗?

I cannot figure out this javascript little oddity that's occurs in Firefox 7.0.1 and Google Chrome 14.0.835.202 (I haven't tested any other versions). Why does /[+-.]/g match commas (,) in addition to plus signs (+), dashes (-) and periods (.)?

// Firebug
>>> "Hello, World++--..".match(/[+-.]/g);
[",", "+", "+", "-", "-", ".", "."]
>>> "Hello, World".match(/[+-.]/g);
[","]

// Chrome Developer Tools:
> "Hello, World++--..".match(/[+-.]/g);
  [",", "+", "+", "-", "-", ".", "."]
> "Hello, World".match(/[+-.]/g);
  [","]

Okay, so maybe I need to escape the period (.)

// Firebug
>>> "Hello, World!".match(/[+-\.]/g);
[","]

// Chrome Developer Tools
> "Hello, World!".match(/[+-\.]/g);
  [","]

Nope. But if I change the order of the plus (+) and dash (-) it stops matching the comma (,).

// Firebug
>>> "Hello, World".match(/[-+.]/g);
null

// Chrome Developer Tools
> "Hello, World".match(/[-+.]/g);
  null

This makes no sense to me. It seems odd that both Firefox and Chrome would share the same regex bug. Does anybody know why this is?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

献世佛 2024-12-18 18:10:45

使用[+\-.]

- 屏蔽一个范围并且必须转义。

Use [+\-.].

- masks a range and must be escaped.

遮了一弯 2024-12-18 18:10:45

在两个其他字符之间的方括号内使用 - 会匹配这些字符之间范围内的所有字符(包括这两个字符)。因此,+U+002B.U+002E。该范围内的所有字符都将包括:

+ U+002B
, U+002C
- U+002D
. U+002E

它与您包含的 3 个字符以及另外一个字符相匹配,这只是一个令人困惑的巧合。您的答案就在您的问题中...将 - 移至方括号中的第一个字符:

/[-+.]/g

或者,您可以转义 -

/[+\-.]/g

Using - within square brackets between two other characters matches all characters in the range between those characters, inclusive. So, + is U+002B and . is U+002E. All of the characters in that range would include:

+ U+002B
, U+002C
- U+002D
. U+002E

That it was matching the 3 characters you included plus one more is just a confusing coincidence. Your answer is in your question... Move the - to be the first character in the square brackets:

/[-+.]/g

Alternatively, you can escape the -:

/[+\-.]/g
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文