【问题标题】:Not sure why my regex is grabbing a few blank items不知道为什么我的正则表达式会抓取一些空白项
【发布时间】:2013-02-26 21:23:15
【问题描述】:

我有这个正则表达式: ([a-z]+)(?:\.).

像这样在 Javascript 中使用它:
"test.thing.other".split(/([a-z]+)(?:\.)/); 最终给了我一个像这样的数组:
["", "test", "", "thing", "other"]
我不知道为什么将第一个和第三个元素放入该数组中。谁能告诉我我做错了什么?

【问题讨论】:

  • 你为什么不按期分开? ..没有正则表达式? stackoverflow.com/a/96452/195488
  • @0A0D :因为这只是复杂正则表达式测试的开始。到目前为止,我只是第一步。
  • 那么这个呢? /[\s.]+/
  • 这对“分裂”非常有效。谢谢!

标签: regex


【解决方案1】:

根据您的问题和评论 “捕获 a-z 直到一段时间” 我相信您应该像这样使用 String.match:

arr = "test.thing.other".match(/[a-z]+(?=\.)/g);

给予:

["test", "thing"]

【讨论】:

  • 你是对的。当“分裂”开始给我的结果更接近我想要的我开始使用它。我现在明白我不应该这样做。
  • 很好的答案 - 但解释会很好,特别是因为您的表达式使用的是不广为人知的零宽度前瞻断言。
  • @KonradRudolph:谢谢你的好话。我的回答是基于我对 OP 的问题和 cmets 的理解。 OP 提到他想要Capture a-z until a period",换句话说,他想要捕获[a-z]+,如果它后面跟着一个句点。正如我在回答中使用的那样,使用积极的前瞻 (?=\.) 很容易满足这一要求。
【解决方案2】:

括号是原因。 MDN says on string.split 是这样说的:

如果separator是包含捕获括号的正则表达式,则每次匹配分隔符时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。

他们也警告:

但是,并非所有浏览器都支持此功能。

所以这个结果可能不一致。如果您只想按表达式的内容进行拆分,请删除括号:

>> 'test.thing.other'.split(/[a-z]+\./)
["", "", "other"]

这也可能不是您想要的,但根据您的表达,这是直观预期的结果。

如果你想按点分割,那么你需要在正则表达式中准确地提供:一个点。

>> 'test.thing.other'.split(/\./)
["test", "thing", "other"]

【讨论】:

  • @0A0D 您正在测试 matcher,而不是 split 的输出。这些方法的行为非常不同,但如果您检查测试页面上的“全局”选项,您仍然会得到一致的结果。
  • 嗯,它仍然是一个奇怪的语法。我想知道这是否适用:stackoverflow.com/a/812179/195488
  • @KonradRudolph :这最终无法捕捉到我想要的东西。我的表达方式是:“捕获 a-z 直到一段时间”,这正是我想要的。我仍然看不到最终如何根据给定的字符串返回两个空白实例。
  • @KonradRudolph:是的,global 为您提供了两个匹配项。你会认为它会返回匹配项......它真正分裂的还有什么。这是一种奇怪的拆分方式。
  • 我想我看到了错误......你必须匹配期间。从某种意义上说,Split 确实返回了匹配项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2011-08-11
  • 2013-07-26
  • 1970-01-01
相关资源
最近更新 更多