棘手的子字符串问题

Tricky substring problems

本文关键字:字符串 问题      更新时间:2023-10-16

我有子字符串的问题,我有一个字符串在我下面的格式当前正在使用getline.

Richard[12345/678910111213141516] was murdered

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

另一个字符串可以是这样的,所以我将抓取6个子字符串。

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

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

简而言之。我怎么解释这些呢?

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

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

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

    Richard///
  • [] []
  • 12345
  • 678910111213141516
  • Ralph [/
  • 54321
  • 161514131211109876

Regex已经向我提到过,但我不知道它是否更适合这项任务,我包含了标签,所以更有经验的人可能会回答/评论

下面是一个获取所有值的正则表达式:

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位或1位以上数字(可选组,可为空)
  • (?:/(d+))? -非捕获可选组匹配
    • / - literal /
    • (d+) -(组3)1位或以上数字。
  • ] -右方括号。

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

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

,它将匹配并存储名称(及其元属性)。我现在正在想它什么时候会破裂。

可以在regex101上进行测试。