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

Javascript 如何在没有给定模式的情况下将字符串拆分为相同的部分?,javascript,php,regex,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,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”。


我想写一个函数来实现这一点,但我知道这将是一个复杂的过程,所以我想问一下,在PHP或Javascript中是否有一个内置的功能,可以实现类似的功能,或者让我的工作更轻松,有什么想法吗?

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

const findPattern=str=>{
常量{length}=str;
for(设i=1;ilog(findPattern('abcd'))听起来最简单的解决方案是从字符串的开头开始,找到从索引0开始的最小子字符串,这样重复该子字符串若干次就会产生输入字符串:

const findPattern=str=>{
常量{length}=str;
for(设i=1;ilog(findPattern('abcd'))您可以使用regexp:
^([a-z]{2,})(?:\1)+$
执行此操作。正则表达式使用递归模式匹配任何具有重复模式的字符串,将该模式置于第一个组中。以下是如何在PHP中使用它:

编辑

正则表达式已经更新,以允许末尾出现不完整的模式(只要有一次重复),然后检查它是否与模式的长度匹配,以允许匹配字符串,例如
abcabca

function check_match($string) {
    if (preg_match('/^([a-z]{2,})(?:\1)+(.*)$/', $string, $matches)) {
        return strlen($matches[2]) == 0 || $matches[2] == substr($matches[1], 0, strlen($matches[2])) ? $matches[1] : false;
    }
    return false;

}

foreach (array("abca", "abcabcab", "abcabcabcabc", "ababcababc", "aabbaabb", "aabaab", "aabaabd", "abcd", "aabcaabc", "abcabca") as $str) {
    if ($pattern = check_match($str))
        echo "$str matched $pattern\n";
    else 
        echo "no pattern for $str\n";
}
输出:

no pattern for abca
abcabcab matched abc
abcabcabcabc matched abcabc
ababcababc matched ababc
aabbaabb matched aabb
aabaab matched aab
no pattern for aabaabd
no pattern for abcd
aabcaabc matched aabc
abcabca matched abc

您可以使用regexp:
^([a-z]{2,})(?:\1)+$
来执行此操作。正则表达式使用递归模式匹配任何具有重复模式的字符串,将该模式置于第一个组中。以下是如何在PHP中使用它:

编辑

正则表达式已经更新,以允许末尾出现不完整的模式(只要有一次重复),然后检查它是否与模式的长度匹配,以允许匹配字符串,例如
abcabca

function check_match($string) {
    if (preg_match('/^([a-z]{2,})(?:\1)+(.*)$/', $string, $matches)) {
        return strlen($matches[2]) == 0 || $matches[2] == substr($matches[1], 0, strlen($matches[2])) ? $matches[1] : false;
    }
    return false;

}

foreach (array("abca", "abcabcab", "abcabcabcabc", "ababcababc", "aabbaabb", "aabaab", "aabaabd", "abcd", "aabcaabc", "abcabca") as $str) {
    if ($pattern = check_match($str))
        echo "$str matched $pattern\n";
    else 
        echo "no pattern for $str\n";
}
输出:

no pattern for abca
abcabcab matched abc
abcabcabcabc matched abcabc
ababcababc matched ababc
aabbaabb matched aabb
aabaab matched aab
no pattern for aabaabd
no pattern for abcd
aabcaabc matched aabc
abcabca matched abc

谢谢你的提问,不过我个人认为你这样做可能有点不合规程。在请求帮助之前,我建议尝试编写函数,如果你陷入困境,请寻求帮助!如果你让它工作,但想改善它,放下它。祝你好运@TylerRoper,为什么在代码评审中不在这里,它与这里有什么不同?@Tarek.hms StackOverflow用于您试图修复或解决特定问题的代码。如果你的代码运行得很好,并且你只是想改进它的编写方式,那么你应该将它发布在代码评审上。@TylerRoper,我明白了,谢谢,我以前不知道。我发现很难理解规则。你能再举几个例子吗?谢谢你的提问,不过我个人认为你这样做可能有点不合规程。在请求帮助之前,我建议尝试编写函数,如果你陷入困境,请寻求帮助!如果你让它工作,但想改善它,放下它。祝你好运@TylerRoper,为什么在代码评审中不在这里,它与这里有什么不同?@Tarek.hms StackOverflow用于您试图修复或解决特定问题的代码。如果你的代码运行得很好,并且你只是想改进它的编写方式,那么你应该将它发布在代码评审上。@TylerRoper,我明白了,谢谢,我以前不知道。我发现很难理解规则。你能再举一些例子吗?哇,那真的很快,我可能应该在发帖前试一试,不管怎样,你的代码非常完美,但有一个例子我以前没有提到过,字符串并不总是完整的,这意味着上一个模式可能缺少了一部分,在这种情况下,仅此代码就将失败,但无论如何,我现在将从那里开始,我相信现在会容易得多,非常感谢。这使它更容易-你可以删除开头的
继续
检查并
切片
。在将其与输入进行比较之前重复调用
,参见editdim,你是如何做到的,这真的令人印象深刻,有什么地方我可以跟随你,比如github或codepen,我真的印象深刻:)哇,这真的很快,我应该在发帖前试一试,不管怎样,你的代码非常完美