根据出现的任何数字拆分字符串

Posted

技术标签:

【中文标题】根据出现的任何数字拆分字符串【英文标题】:Split a string based on any number occurrence 【发布时间】:2013-08-03 07:52:01 【问题描述】:

如何使用正则表达式根据出现的数字拆分字符串?

例如,我有一个如下所示的字符串。

var text = "1 dozen 3 dozen 4 dozen kg";

我需要像这样拆分它,

预期输出:

1 dozen   
3 dozen   
4 dozen kg

我尝试了以下正则表达式,

var text = "1 dozen 3 dozen 4 dozen kg";
var regex = /(\d\s)/g;  // regex I tried
console.log(text.split(regex));

但以

结束

["","1","打","3","打","4","打公斤"]

请帮助我构建regex,如果我的问题不清楚,请随时提出。

fiddle

【问题讨论】:

@FakeRainBrigand 感谢您的提琴。 【参考方案1】:

你为什么不用match

var text = "1 dozen 3 dozen 4 dozen kg";
var regex = /\d\s\D+/g;
console.log(text.match(regex)); //=> ["1 dozen ", "3 dozen ", "4 dozen kg"]

【讨论】:

您可能希望将\D 替换为[^\s\d]\w。否则你会得到那些尾随空格。 @FakeRainBrigand:好点,不确定 OP 是否需要它们。 @FakeRainBrigand:这样替换不太正确。它将返回“4打”而不是“4打公斤” 您到底想知道什么?如果你想去掉尾随空格,你可以这样做text.match(regex).map(function(v) return v.trim() ) \d+(?:\s+[^\d\s]+)+ 将匹配一个数字(一个或多个数字)后跟一个或多个单词(“单词”被定义为一个或多个非数字、非空白字符)。【参考方案2】:

这个基于positive lookahead 的拆分调用可以完成这项工作:

var arr = text.split(/\s*(?=\d+)/);

将给予:

["1 dozen", "3 dozen", "4 dozen kg"]

解释:分解这个正则表达式/\s*(?=\d+)/

\s*        - match 0 or more spaces
(?=\d+)    - Make sure previous match is immediately followed by 1 or more digits
\s*(?=\d+) - match 0 or more spaces if it is immediately followed by 1 or more digits

PS:(?=\d+) 实际上是一个positive lookahead。

【讨论】:

您可以在 split 调用后添加 .slice(1) 以删除第一个元素。 @anuBhava +1 不错。您能否添加有关您的正则表达式的详细信息/解释?正则表达式让我头晕目眩。 @user1671639:添加了一些关于正向预测的解释和非常好的教程。

以上是关于根据出现的任何数字拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在任何第一个数字之前拆分字符串

根据字符的第一次出现拆分字符串

查找字符串中最后一次出现的数字,并按该值拆分字符串

当出现任何给定的分隔符时拆分 JavaScript 字符串 [重复]

Oracle Regexp 根据第一次出现的分隔符拆分字符串

根据长度和逗号拆分输入字符串(送货地址数据)