棘手的子串问题

时间:2015-09-30 06:39:57

标签: c++ regex substring getline

我遇到了子串的问题,我有一个下面格式的字符串 目前正在使用getline。

Richard[12345/678910111213141516] was murdered

我一直在使用find_last_offind_first_of来获取括号和正斜杠之间的位置以检索每个字段。我有这个工作和功能,但我遇到了一个问题。 name字段的长度可以是32个字符,并且可以包含/和[]所以当我最终遇到一个带有他的名字的URL的用户时,它不喜欢它。这些数字在每个用户的基础上也是随机的。我正在从字符串,名称和两个识别号码中检索每个字段。

另一个字符串可能看起来像这样,所以我会抓住6个子字符串。

Richard[12345/678910111213141516] was murdered by Ralph[54321/161514131211109876]

这只是另一个巨大的混乱,我正在考虑做的是从后面开始并移动到前面,但如果第二名字段(拉尔夫)包含任何/或[]它将破坏计数检索第一部分。任何见解都会有所帮助。谢谢。

简而言之。我如何解释这些。

名称还可以包含任何字母/数字和特殊字符。

Richard///[][][12345/678910111213141516] was murdered by Ralph[/[54321/161514131211109876]

最终结果将是6个包含此字符串的子字符串。

  • 理查德/// [] []
  • 12345
  • 678910111213141516
  • 拉尔夫[/
  • 54321
  • 161514131211109876

我已经提到了正则表达式,但我不知道它是否更适合这项任务,我包含了标签,所以有更多经验的人可能会回答/评论。

2 个答案:

答案 0 :(得分:2)

可能的正则表达式解决方案是使用如下模式:

(\S+)\[(\d+)/(\d+)\](?:\s|$)

将匹配并存储名称(带有元属性)。我正在考虑它可能会破裂的方法。

您可以对其进行测试on regex101

答案 1 :(得分:2)

以下是获取所有值的正则表达式方法:

string str = "Richard///[][][12345/678910111213141516] was murdered by Ralph[/[54321/161514131211109876]";
regex rgx1(R"(([A-Z]\w*\s*\S*)\[(\d+)?(?:\/(\d+))?\])");
smatch smtch;
while (regex_search(str, smtch, rgx1)) {
        std::cout << "Name: " << smtch[1] << std::endl;
        std::cout << "ID1: " << smtch[2] << std::endl;
        std::cout << "ID2: " << smtch[3] << std::endl;
        str = smtch.suffix().str();
    }

请参阅IDEONE demo

正则表达式(\S*)\[(\d+)?(?:/(\d+))?\]匹配:

  • (\S*) - (第1组)0个或更多非空白符号,尽可能多
  • \[ - 一个开头方括号(必须转义,因为它是为字符类保留的正则表达式中的特殊字符)
  • (\d+)? - (第2组)1位或更多位数(可选组,可以为空)
  • (?:/(\d+))? - 非捕获可选组匹配
    • / - 文字/
    • (\d+) - (第3组)1位或更多位数。
  • \] - 关闭方括号。