c_cpp CPP - 教程019 - C ++正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp CPP - 教程019 - C ++正则表达式相关的知识,希望对你有一定的参考价值。

// ----- BEGINNING REGEX -----

void PrintMatches(std::string str,
        std::regex reg){
    
    // Used when your searching a string
    std::smatch matches;
    
    // Show true and false in output
    std::cout << std::boolalpha;
       
    // Determines if there is a match and match 
    // results are returned in matches
    while(std::regex_search(str, matches, reg)){
        std::cout << "Checked for Results : " << 
                matches.ready() << "\n";
        
        std::cout << "Are there no matches : " << 
                matches.empty() << "\n";
        
        std::cout << "Number of matches : " << 
                matches.size() << "\n";
        
        // Get the first match
        std::cout << matches.str(1) << "\n";
        
        // Eliminate the previous match and create
        // a new string to search
        str = matches.suffix().str();
        
        std::cout << "\n";
    }
}

// ----- END BEGINNING REGEX -----

// ----- ITERATOR REGEX -----

void PrintMatches2(std::string str,
        std::regex reg){
    
    // This holds the first match
    std::sregex_iterator currentMatch(str.begin(),
            str.end(), reg);
    
    // Used to determine if there are any more matches
    std::sregex_iterator lastMatch;
    
    // While the current match doesn't equal the last
    while(currentMatch != lastMatch){
        std::smatch match = *currentMatch;
        std::cout << match.str() << "\n";
        currentMatch++;
    }
    std::cout << std::endl;
    
}

// ----- END ITERATOR REGEX -----

int main()
{
    // ----- BEGINNING REGEX -----
    
    std::string str = "The ape was at the apex";
      
    // Create the pattern to search for which is
    // the letters ape followed maybe by anything
    // that is not a space
    std::regex reg ("(ape[^ ]?)");
    
    PrintMatches(str,reg);
    
    // ----- END BEGINNING REGEX -----
    
    // ----- ITERATOR REGEX -----
    
    // Using an iterator with all matches
    
    std::string str2 = "I picked the pickle";
    
    // Match (+) 1 or more of anything not a space
    std::regex reg2 ("(pick([^ ]+)?)");
    
    PrintMatches2(str2,reg2);
    
    // ----- END ITERATOR REGEX -----
    
    // ----- MATCH 1 OF SEVERAL LETTERS -----
    
    std::string str3 = "Cat rat mat fat pat";
    
    // Match any character in [] plus what follows
    std::regex reg3 ("([crmfp]at)");
    
    PrintMatches2(str3,reg3);
    
    // We can also match characters in a range
    std::regex reg4("[C-Fc-f]at");
    PrintMatches2(str3,reg4);
    
    // Use ^ to denote any character except for
    // those in brackets
    std::regex reg5("[^Cr]at");
    PrintMatches2(str3,reg5);
    
    // ----- END MATCH 1 OF SEVERAL LETTERS -----
    
    // ----- REPLACE MATCHES -----
    
    std::string str6 = "Cat rat mat fat pat";
    std::regex reg6("[Cr]at");
    
    // Replace matches with Owl in the output
    std::string owlFood = std::regex_replace(str6,reg6,"Owl");
    std::cout << owlFood << "\n";
    
    // ----- END REPLACE MATCHES -----
    
    // ----- MATCHING ANY CHARACTER -----
    
    // . matches any character, but if we want to
    // search for a . we escape it with \
    
    std::string str7 = "F.B.I. I.R.S. CIA";
    std::regex reg7("([^ ]\..\..\.)");
    PrintMatches2(str7,reg7);
    
    
    // ----- END MATCHING ANY CHARACTER -----
    
    // ----- MATCHING WHITESPACE -----
    
    // We can match any whitespace character
    std::string str8 = "This is a\n multiline string\n"
            "that has many lines";
    std::regex reg8("\n");
    std::string noLBStr = std::regex_replace(str8,reg8," ");
    std::cout << noLBStr << "\n";
    
    // You can also replace
    // \b : Backspace
    // \f : Form Feed
    // \r : Carriage Return
    // \t : Tab
    // \v : Vertical Tab
    
    // ----- END MATCHING WHITESPACE -----
    
    // ----- MATCHING SINGLE NUMBERS -----
    
    // \d can be used instead of [0-9]
    // \D is the same as [^0-9]
    std::string str9 = "12345";
    std::regex reg9("\\d");
    PrintMatches2(str9, reg9);
    
    // You can also match within a range
    std::string str10 = "123 12345 123456 1234567";
    
    // Match values that are between 5 and 7 digits
    std::regex reg10("\\d{5,7}");
    PrintMatches2(str10, reg10);
    
    // ----- END MATCHING SINGLE NUMBERS -----
    
    // ----- MATCHING ANY SINGLE LETTER OR NUMBER -----
    
    // \w is the same as [a-zA-Z0-9_]
    // \W is the same as [^a-zA-Z0-9_]
    std::string str11 = "412-555-1212";
    
    // Check if it is a phone number
    std::regex reg11("\\w{3}-\\w{3}-\\w{4}");
    PrintMatches2(str11, reg11);
    
    // ----- END MATCHING ANY SINGLE LETTER OR NUMBER -----
    
    // ----- MATCHING WHITESPACE -----
    
    // \s is the same as [\f\n\r\t\v]
    // \S is the same as [^\f\n\r\t\v]
    
    std::string str12 = "Toshio Muramatsu";
    
    // Check if its a valid name
    std::regex reg12("\\w{2,20}\\s\\w{2,20}");
    PrintMatches2(str12, reg12);
    
    // ----- END MATCHING WHITESPACE -----
    
    // ----- MATCHING ONE OR MORE -----
    
    // Match a followed by 1 or more characters
    std::string str13 = "a as ape bug";
    
    std::regex reg13("a[a-z]+");
    PrintMatches2(str13, reg13);
    
    // ----- END MATCHING ONE OR MORE -----
    
    // ----- PROBLEM -----
    // Create a Regex that matches email addresses 
    // from a list
    // 1. 1 to 20 lowercase and uppercase letters, 
    // numbers, plus ._%+-
    // 2. An @ symbol
    // 3. 2 to 20 lowercase and uppercase letters, 
    // numbers, plus .-
    // 4. A period
    // 5. 2 to 3 lowercase and uppercase letters
    
    std::string str14 = "db@aol.com m@.com @apple.com db@.com";
    
    std::regex reg14("[\\w._%+-]{1,20}@[\\w.-]{2,20}.[A-Za-z]{2,3}");
    PrintMatches2(str14, reg14);
    
    
    // ----- END PROBLEM -----
    
    return 0;
}

以上是关于c_cpp CPP - 教程019 - C ++正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp CPP - 教程001 - 简介

c_cpp CPP - 教程020 - C ++ Regex 2

c_cpp CPP - 教程017 - 序列容器

c_cpp CPP - 教程013 - 高级功能

c_cpp CPP - 教程011 - 多态性

c_cpp CPP - 教程006 - 练习题