根据出现的任何数字拆分字符串
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 字符串 [重复]