Search code examples
regexmatlabpattern-matchingoctavemaple

Finding the shortest repetitive pattern in a string


I was wondering if there was a way to do pattern matching in Octave / matlab? I know Maple 10 has commands to do this but not sure what I need to do in Octave / Matlab. So if a number was 12341234123412341234 the pattern match would be 1234. I'm trying to find the shortest pattern that upon repetiton generates the whole string.

Please note: the numbers (only numbers will be used) won't be this simple. Also, I won't know the pattern ahead of time (that's what I'm trying to find). Please see the Maple 10 example below which shows that the pattern isn't known ahead of time but the command finds the pattern.

Example of Maple 10 pattern matching:

ns:=convert(12341234123412341234,string);

             ns := "12341234123412341234"

StringTools:-PrimitiveRoot(ns);

             "1234"

How can I do this in Octave / Matlab? Ps: I'm using Octave 3.8.1


Solution

  • To find the shortest pattern that upon repetition generates the whole string, you can use regular expressions as follows:

    result = regexp(str, '^(.+?)(?=\1*$)', 'match');
    

    Some examples:

    >> str = '12341234123412341234';
    >> result = regexp(str, '^(.+?)(?=\1*$)', 'match')
    result = 
        '1234'
    
    >> str = '1234123412341234123';
    >> result = regexp(str, '^(.+?)(?=\1*$)', 'match')
    result = 
        '1234123412341234123'
    
    >> str = 'lullabylullaby';
    >> result = regexp(str, '^(.+?)(?=\1*$)', 'match')
    result = 
        'lullaby'
    
    >> str = 'lullaby1lullaby2lullaby1lullaby2';
    >> result = regexp(str, '^(.+?)(?=\1*$)', 'match')
    result = 
        'lullaby1lullaby2'