Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript正则表达式捕获小数的重复部分_Javascript_Regex - Fatal编程技术网

JavaScript正则表达式捕获小数的重复部分

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,

寻找最好的方法获取可能重复小数部分的任意数字,并发现重复部分(如果存在)

最后,我需要使用上划线符号(css文本装饰或MathML mline)来装饰数字,因此我还需要知道重复开始的位置的索引

因此,我需要正则表达式,它将得到(或可用于算法中)以下结果:

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+$/
    • \。
      匹配小数点
    • (\d*?)
      匹配小数点和重复之间的数字,并将结果捕获到反向参考编号1中
    • (\d+?)
      匹配重复项,并将其捕获到反向参考编号2中
    • \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