JavaScript无法使用正则表达式拆分字符串

19

我在写这个问题的过程中,我想我已经找到了我所有问题的答案,但我还是想发帖,因为它可能对他人有用,而且更多的解释可能会有所帮助。

我尝试使用具有前瞻的正则表达式和javascript函数split。 由于某种原因,即使在调用match时找到匹配项,它也无法拆分字符串。 我最初认为问题来自于我的正则表达式中使用了前瞻。 这里是一个简化的示例:

不起作用:

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

可行:

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

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

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

我用以下看起来有些愚蠢的例子证实了我的理论:

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

还有其他人认为match函数假定输入是正则表达式而split函数不做这样的假设,这是否有些奇怪?


我一直使用/regex/(不带引号)语法来进行匹配、分割和替换。我没有意识到在某些情况下你不必这样做。 - Mark Biek
2
实际上,让match()假设一个正则表达式是有道理的(你可以匹配什么其他东西呢?)并且让split()假设一个字符串,因为在字符串上分割可能比在正则表达式上分割要快。只有当你向split()传递一个实际的正则表达式时,它才会执行更慢的正则表达式分割。 - Tomalak
2个回答

31

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

我想,String.match会尝试使用传递的任何内容;因此,如果您传递一个字符串,它将将其解释为正则表达式。但是,String.split方法不能这样做,因为它可以接受正则表达式和字符串;在这种情况下,这样做是愚蠢的。


编辑:(来自《JavaScript权威指南》)

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


3

如果我没记错的话(但是我可能很错误),在正则表达式引擎广泛使用之前,JavaScript 中实现了 split 方法,因此它可能是为了向后兼容性而存在。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接