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 不会使用正则表达式拆分的主要内容,如果未能解决你的问题,请参考以下文章