Search code examples
regexqregexp

Capture multiple texts.


I have a problem with Regular Expressions.

Consider we have a string

 S= "[sometext1],[sometext],[sometext]....,[sometext]"

The number of the "sometexts" is unknown,it's user's input and can vary from one to ..for example,1000.

[sometext] is some sequence of characters ,but each of them is not ",",so ,we can say [^,].

I want to capture the text by some regular expression and then to iterate through the texts in cycle.

QRegExp p=new QRegExp("???");
p.exactMatch(S);
for(int i=1;i<=p.captureCount;i++)
{
  SomeFunction(p.cap(i));
}

For example,if the number of sometexts is 3,we can use something like this:

([^,]*),([^,]*),([^,]*).

So,i don't know what to write instead of "???" for any arbitrary n. I'm using Qt 4.7,I didn't find how to do this on the class reference page.
I know we can do it through the cycles without regexps or to generate the regex itself in cycle,but these solutions don't fit me because the actual problem is a bit more complex than this..


Solution

  • A possible regular expression to match what you want is:

    ([^,]+?)(,|$)
    

    This will match string that end with a coma "," or the end of the line. I was not sure that the last element would have a coma or not.

    An example using this regex in C#:

    String textFromFile = "[sometext1],[sometext2],[sometext3],[sometext4]";
    
    foreach (Match match in Regex.Matches(textFromFile, "([^,]+?)(,|$)"))
    {
        String placeHolder = match.Groups[1].Value;
    
        System.Console.WriteLine(placeHolder);
    }
    

    This code prints the following to screen:

    [sometext1]
    [sometext2]
    [sometext3]
    [sometext4]
    

    Using an example for QRegex I found online here is an attempt at a solution closer to what you are looking for: (example I found was at: http://doc.qt.nokia.com/qq/qq01-seriously-weird-qregexp.html)

    QRegExp rx( "([^,]+?)(,|$)");
    rx.setMinimal( TRUE ); // this is if the Qregex does not understand the +? non-greedy notation.
    
    int pos = 0;
    while ( (pos = rx.search(text, pos)) != -1 ) 
    {
         someFunction(rx.cap(1));
    }
    

    I hope this helps.