Javascript 不会使用正则表达式拆分

Posted

技术标签:

【中文标题】Javascript 不会使用正则表达式拆分【英文标题】:Javascript won't split using regex 【发布时间】:2010-10-23 03:59:02 【问题描述】:

自从我开始写这个问题以来,我想我已经找到了每个问题的答案,但我想我还是会发布,因为它可能对其他人有用并且更多的澄清可能会有所帮助。

我试图在 javascript 函数拆分中使用带有前瞻的正则表达式。由于某种原因,即使在我调用 match 时它找到了匹配项,它也没有拆分字符串。我最初认为问题出在我的正则表达式中使用前瞻。这是一个简化的例子:

不起作用:

"aaaaBaaaa".split("(?=B).");

作品:

"aaaaBaaaa".match("(?=B).");

问题似乎是在拆分示例中,传递的字符串没有被解释为正则表达式。使用正斜杠而不是引号似乎可以解决问题。

"aaaaBaaaa".split(/(?=B)./);

我用下面这个看起来很傻的例子证实了我的理论:

"aaaaaaaa(?=B).aaaaaaa".split("(?=B).");

有没有人觉得 match 函数假设你有一个正则表达式而 split 函数没有这很奇怪?

【问题讨论】:

我一直使用 /regex/(无引号)语法来处理所有事情:匹配、拆分、替换。我没有意识到在某些情况下您不必这样做。 实际上让 match() 假设一个正则表达式是有意义的(else 会有什么可以匹配的?)并且 split() 假设一个字符串,因为拆分在字符串上可能比在正则表达式上拆分更快。仅当您将实际的正则表达式传递给 split() 时,它才会执行较慢的正则表达式拆分。 【参考方案1】:

String.split 接受字符串或正则表达式作为其第一个参数。 String.match 方法只接受正则表达式。

我想 String.match 会尝试处理通过的任何内容;因此,如果您传递一个字符串,它会将其解释为正则表达式。 String.split 方法没有这样做的奢侈,因为它可以接受正则表达式和字符串;在这种情况下,事后猜测是愚蠢的。


编辑:(来自:“JavaScript:权威指南”)

String.match 需要使用正则表达式。传递的参数需要是一个 RegExp 对象,指定要匹配的模式。如果此参数不是 RegExp,则首先通过将其传递给 RegExp() 构造函数将其转换为一个。

【讨论】:

【参考方案2】:

如果我没记错的话(这里我可能搞错了),split 方法是在正则表达式引擎被广泛使用之前在 javascript 中实现的,所以它可能是为了向后兼容。

【讨论】:

我认为这成立; String.split 是在 1.1 中引入的,而正则表达式是在 1.2 中引入的。阅读有关split() 的文档(此处:wp.netscape.com/eng/mozilla/3.0/handbook/javascript/newfunc.htm),以及此处对split() 的正则表达式增强:web.archive.org/web/20010408055419/developer.netscape.com/docs/…(没有直接链接,请查看“正则表达式”->“字符串方法”

以上是关于Javascript 不会使用正则表达式拆分的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中将长正则表达式拆分为多行?

Javascript 和正则表达式:拆分字符串并保留分隔符

JavaScript正则表达式

带有 unicode 和标点符号的 Javascript 正则表达式

使用正则表达式拆分数学表达式

JavaScript 正则表达式