在javascript中通过正则表达式分割线?

Roy*_*mir 7 javascript regex

我有这种文字结构:

1.6.1 Members................................................................ 12
1.6.2 Accessibility.......................................................... 13
1.6.3 Type parameters........................................................ 13
1.6.4 The T generic type aka <T>............................................. 13
Run Code Online (Sandbox Code Playgroud)

我需要创建JS对象:

{ 
  num:"1.6.1",
  txt:"Members"
},
{ 
  num:"1.6.2",
  txt:"Accessibility"
} ...
Run Code Online (Sandbox Code Playgroud)

那不是问题.

问题是我想通过积极前瞻的正则表达式分割来提取值:

通过一次看到下一个字符是一个字母时拆分

在此输入图像描述

我试过了什么:

'1.6.1 Members........... 12'.split(/\s(?=(?:[\w\. ])+$)/i)
Run Code Online (Sandbox Code Playgroud)

这很好用:

["1.6.1", "Members...........", "12"] // I don't care about the 12.
Run Code Online (Sandbox Code Playgroud)

但如果我有2个字或更多:

'1.6.3 Type parameters................ 13'.split(/\s(?=(?:[\w\. ])+$)/i)
Run Code Online (Sandbox Code Playgroud)

结果是:

["1.6.3", "Type", "parameters................", "13"] //再一次,我不在乎13.

当然我可以加入他们,但我希望这些话能够在一起.

题 :

如何增强我的正则表达式而不是分裂单词?

期望的结果:

["1.6.3", "Type parameters"]

要么

["1.6.3", "Type parameters........"] //我稍后会删除附加内容

要么

["1.6.3", "Type parameters........13"]//我稍后会删除附加内容

NB

我知道我可以通过""或其他更简单的解决方案进行拆分,但我正在寻求(纯粹的知识)对我的解决方案进行增强,使用正向前瞻分割.

完整的在线示例:

nb2:

文本中间也可以包含大写字母.

anu*_*ava 3

您可以使用这个正则表达式:

/^(\d+(?:\.\d+)*) (\w+(?: \w+)*)/gm
Run Code Online (Sandbox Code Playgroud)

并使用匹配组 #1 和匹配组 #2 获得您想要的匹配。

在线正则表达式演示

更新:您可以String#split使用此正则表达式:

/ +(?=[A-Z\d])/g
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

更新 2:由于章节名称中也可能包含大写字母,因此需要更复杂的正则表达式:

var re = /(\D +(?=[a-z]))| +(?=[a-z\d])/gmi; 
var str = '1.6.3 Type Foo Bar........................................................ 13';
var m = str.split( re );
console.log(m[0], ',', m.slice(1, -1).join(''), ',', m.pop() );

//=> 1.6.3 , Type Foo Bar........................................................ , 13
Run Code Online (Sandbox Code Playgroud)