2

我想知道是否有人可以帮助我,我一直在寻找正则表达式示例,但我仍然无法理解它。

字符串如下所示:

“用户 JaneDoe,IP:12.34.56.78”

“用户 JohnDoe,IP:34.56.78.90”

我将如何制作与上述字符串匹配的表达式?

4

2 回答 2

4

问题是您究竟想如何匹配这些,以及您还想排除什么?

任何传入的字符串与简单的.*.

为了更准确地匹配这些(并增加提取用户名和/或 IP 等内容的可能性),您可以使用类似:"User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})". 根据您的输入,这可能仍会遇到名称包含逗号的问题(例如,“John James, Jr.”)。如果你不得不考虑到这一点,它很快就会变得相当丑陋。

编辑:这里有一些代码来测试/演示上面的正则表达式。目前,这是使用 C++0x 正则表达式类 - 要使用 Boost,您需要稍微更改命名空间(但我相信这应该是全部)。

#include <regex>
#include <iostream>

void show_match(std::string const &s, std::regex const &r) { 
    std::smatch match;
    if (std::regex_search(s, match, r))
        std::cout << "User Name: \"" << match[1] 
                  << "\", IP Address: \"" << match[2] << "\"\n";
    else
        std::cerr << s << "did not match\n";
}

int main(){ 

    std::string inputs[] = {
        std::string("User JaneDoe, IP: 12.34.56.78"),
        std::string("User JohnDoe, IP: 34.56.78.90")
    };

    std::regex pattern("User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})");

    for (int i=0; i<2; i++)
        show_match(inputs[i], pattern);
    return 0;
}

这会打印出用户名和 IP 地址,但以(几乎没有)不同的格式来清楚地表明它正在匹配并打印出各个部分,而不仅仅是传递整个字符串。

于 2011-02-22T04:47:34.010 回答
3
#include <string> 
#include <iostream>
#include <boost/regex.hpp>

int main() {

    std::string text = "User JohnDoe, IP: 121.1.55.86";
    boost::regex expr ("User ([^,]*), IP: (\\d{1,3}(\\.\\d{1,3}){3})");

    boost::smatch matches;

    try
    {
        if (boost::regex_match(text, matches, expr)) {

            std::cout << matches.size() << std::endl;

            for (int i = 1; i < matches.size(); i++) {
                std::string match (matches[i].first, matches[i].second);
                std::cout << "matches[" << i << "] = " << match << std::endl;
            }

        }
        else {
            std::cout << "\"" << expr << "\" does not match \"" << text << "\". matches size(" << matches.size() << ")" << std::endl;
        }
    } 
    catch (boost::regex_error& e)
    {
        std::cout << "Error: " << e.what() << std::endl;
    }

    return 0;
}

Edited: Fixed missing comma in string, pointed out by Davka, and changed cmatch to smatch

于 2011-02-22T06:40:15.377 回答