我有这种文本结构:
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
我需要创建JS对象:
{
num:"1.6.1",
txt:"Members"
},
{
num:"1.6.2",
txt:"Accessibility"
} ...
那不是问题。
问题是我想通过正向超前通过Regex split提取值:
通过拆分第一次看到,明年字符是字母
我尝试了什么:
'1.6.1 Members........... 12'.split(/\s(?=(?:[\w\. ])+$)/i)
这工作正常:
["1.6.1", "Members...........", "12"] // I don't care about the 12.
但是如果我有2个单词或更多:
'1.6.3 Type parameters................ 13'.split(/\s(?=(?:[\w\. ])+$)/i)
结果是:
["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:
文本中间也可以包含大写字母。
您可以使用此正则表达式:
/^(\d+(?:\.\d+)*) (\w+(?: \w+)*)/gm
并使用匹配的组#1和匹配的组#2获得所需的匹配项。
更新:对于String#split
您可以使用这个表达式:
/ +(?=[A-Z\d])/g
更新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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句