棘手的子串问题

Tricky substring problems

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

Richard[12345/678910111213141516] was murdered

我一直在使用 find_last_offind_first_of 来获取括号和正斜杠之间的位置以检索每个字段。我有这个工作和功能,但我 运行 遇到了问题。名称字段的长度可以是 32 个字符,并且可以包含 / 和 [],所以当我最终 运行 进入一个名称为 URL 的用户时,它并不喜欢那样。每个用户的数量也是 运行dom。我正在从字符串、名称和两个标识号中检索每个字段。

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

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

这又是一团糟,我想做的是从后面开始,然后移到前面,但是如果第二个名字字段 (Ralph) 包含任何 / 或 [],它就会毁了检索第一部分的计数。任何见解都会有所帮助。谢谢。

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

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

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

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

有人向我提到了正则表达式,但我不知道它是否更适合这项任务,我包含了标签以便更有经验的人可能 answer/comment。

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

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

这将匹配并存储名称(及其元属性)。我目前正在考虑它何时会崩溃的方法。

你可以测试一下on regex101

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

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 个或多个数字。
  • \] - 右方括号。