程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

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

发布于2022-06-23 18:47     阅读(986)     评论(0)     点赞(19)     收藏(3)


我有一个函数,它每次返回一个不同的字符串,但具有特定的随机模式,这种模式可以像“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 中是否有内置功能可以做一些接近的事情或完成这项工作对我来说更容易,所以有什么想法吗?


解决方案


您可以使用正则表达式执行此操作:^([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


所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.phpheidong.com/blog/article/349987/fcdc469e7abe56df9459/

来源:php黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

19 0
收藏该文
已收藏

评论内容:(最多支持255个字符)