JavaScript正则表达式捕获小数的重复部分
寻找最好的方法获取可能重复小数部分的任意数字,并发现重复部分(如果存在) 最后,我需要使用上划线符号(css文本装饰或MathML mline)来装饰数字,因此我还需要知道重复开始的位置的索引 因此,我需要正则表达式,它将得到(或可用于算法中)以下结果:JavaScript正则表达式捕获小数的重复部分,javascript,regex,Javascript,Regex,寻找最好的方法获取可能重复小数部分的任意数字,并发现重复部分(如果存在) 最后,我需要使用上划线符号(css文本装饰或MathML mline)来装饰数字,因此我还需要知道重复开始的位置的索引 因此,我需要正则表达式,它将得到(或可用于算法中)以下结果: 1.333 // result: {"pattern": 3, index: 0} 1.5444 // result: {"pattern": 4, index: 1} 1.123123 // result: {"pattern": 123,
1.333 // result: {"pattern": 3, index: 0}
1.5444 // result: {"pattern": 4, index: 1}
1.123123 // result: {"pattern": 123, index: 0}
1.5432121212 // result: {"pattern": 12, index: 4}
1.321 // result: null
1.44212 // result: null
其他示例(来自评论):
您可以尝试以下方法:
(\d+?)\1+$
它匹配了一定数量的数字,然后使用反向引用尝试匹配同一集合,然后立即匹配1次或多次。它被锚定在绳子的末端,因为否则它会被绊倒,例如:
1.5432121212
它将看到21
重复,而不是12
将?
添加到第一个组以使其非贪婪应该可以解决Louis提出的1.3333
的问题
(.+)(?:\1)+$
试试这个。看演示
它的工作原理如下:
(\d+?)\1+$
- 首先,将数字转换为字符串,以便能够使用正则表达式
- 然后,匹配此正则表达式:
:/\(\d*?)(\d+)\2+$/
匹配小数点\。
匹配小数点和重复之间的数字,并将结果捕获到反向参考编号1中(\d*?)
匹配重复项,并将其捕获到反向参考编号2中(\d+?)
匹配重复项的重复\2+
匹配字符串的结尾$
- 最后,如果匹配项为
(即没有匹配项),则返回null
null
- 否则,返回一个对象,该对象包含转换为数字的重复次数(反向参考2),以及点和重复次数(反向参考1)之间的位数
var re = /(\d+)\1$/;
var s = '.5439876543212211211';
var result = re.exec( s );
console.log ( result.index );
//=> 14
console.log ( result[1] );
//=> 211
是的,你肯定需要锚。@Cerbrus:同意。写完这篇文章后,我立即注意到
1.5432121212
示例的问题。@Louis:更新了我的答案。您应该在示例列表中至少添加一个案例:1.3333//result:{“pattern”:3,index:0}
,因为下面的许多答案在这个案例中都失败了。(我假设你想要的是一个通用的解决方案,而不仅仅是一个适用于某些数字的解决方案。)你是否介意这种方法会错误地宣称非重复分数的十进制表示法(如133/100-正好是1.33)是重复的?@AndrewMedico:一个非常好的观点。像5/3这样的数字如何表示1.6666666 7
?@AndrewMedico-不,它实际上只是一个显示功能,因此如果客户端向它传递一个数字,它们就知道返回的是什么。当输入为1.3333
(用4位数字而不是3位数字)时失败。它的结果是33
而不是3
@Louis:匹配的部分是result[1]
@anubhava:这是错误的,因为它需要捕获字符串末尾的重复数字。也就是说,它应该在1.3333
中捕获3
,但在1.3332
中不捕获任何内容,因为1.3332
不是。@MattBurland:谢谢你的评论。不知何故,我忽略了问题的结尾部分。现在已经更正了。谢谢奥利奥,这真的让我走上了正轨!这就是方法!
var re = /(\d+)\1$/;
var s = '.5439876543212211211';
var result = re.exec( s );
console.log ( result.index );
//=> 14
console.log ( result[1] );
//=> 211