如何在没有给定模式的情况下将字符串拆分为相同的部分?

时间:2018-08-19 04:16:11

标签: javascript php regex

我有一个函数,每次返回不同的字符串但具有特定的随机模式时,该模式可能很简单,例如“ a,b,c, a,b,c ”更复杂。

所以我需要编写一个在字符串中搜索模式并将其返回的函数。

只有一个条件要考虑,比如说我们有以下字符串:“ a,b,a,b,c,a,b,a,b,c”

在该字符串中,您不能说“ a,b”是一个模式,要将特定字符串视为模式,则它应比其余字符串长,在这种情况下,“ a,b”为( 2位* 2)= 4,其余为“ c,a,b,a,b,c” 6位数字,因此考虑的实际模式为“ a,b,a,b,c”。

我本打算编写一个函数来完成此任务,但我知道这将是一个复杂的过程,因此我想先问一下SO,也许在PHP或Javascript中是否有一个内置功能可以做到这一点,或者让我的工作变得更轻松,所以有想法吗?

2 个答案:

答案 0 :(得分:5)

听起来像最简单的解决方案是从字符串的开头开始,然后找到从索引0开始的最小子字符串,这样重复该子字符串若干次就会产生输入字符串:

const findPattern = str => {
  const { length } = str;
  for (let i = 1; i < str.length - 1; i++) {
    const testPattern = str.slice(0, i);
    const repeats = Math.ceil(length / i);
    if (str === testPattern.repeat(repeats).slice(0, length)) return testPattern;
  }
  return 'No pattern found';
}
console.log(findPattern('ababcababc'));
console.log(findPattern('aabbaabb'));
console.log(findPattern('aabaab'));
console.log(findPattern('aabaabaab'));
console.log(findPattern('abcdabc'));
console.log(findPattern('abcd'));

答案 1 :(得分:2)

您可以使用正则表达式.Exclude()进行此操作。正则表达式使用递归模式来匹配具有重复模式的任何字符串,并将该模式​​放在第一组中。这是在PHP中使用它的方法:

修改

正则表达式已更新,以允许最后使用不完整的模式(只要重复了一次),然后检查其长度是否与模式匹配,以允许匹配字符串,例如{{1 }}。

^([a-z]{2,})(?:\1)+$

输出:

abcabca