棘手的子串问题
Tricky substring problems
我的子字符串有问题,我有一个格式如下的字符串
目前正在使用 getline。
Richard[12345/678910111213141516] was murdered
我一直在使用 find_last_of
和 find_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 个子字符串。
- 理查德///[][]
- 12345
- 678910111213141516
- 拉尔夫[/
- 54321
- 161514131211109876
有人向我提到了正则表达式,但我不知道它是否更适合这项任务,我包含了标签以便更有经验的人可能 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();
}
正则表达式 (\S*)\[(\d+)?(?:/(\d+))?\]
匹配:
(\S*)
-(第 1 组)0 个或多个非空白符号,尽可能多。
\[
- 左方括号(必须转义,因为它是正则表达式中为字符 类 保留的特殊字符)
(\d+)?
- (第2组)1个或多个数字(可选组,可以为空)
(?:/(\d+))?
- 非捕获可选组匹配
/
- 文字 /
(\d+)
-(第 3 组)1 个或多个数字。
\]
- 右方括号。
我的子字符串有问题,我有一个格式如下的字符串 目前正在使用 getline。
Richard[12345/678910111213141516] was murdered
我一直在使用 find_last_of
和 find_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 个子字符串。
- 理查德///[][]
- 12345
- 678910111213141516
- 拉尔夫[/
- 54321
- 161514131211109876
有人向我提到了正则表达式,但我不知道它是否更适合这项任务,我包含了标签以便更有经验的人可能 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();
}
正则表达式 (\S*)\[(\d+)?(?:/(\d+))?\]
匹配:
(\S*)
-(第 1 组)0 个或多个非空白符号,尽可能多。\[
- 左方括号(必须转义,因为它是正则表达式中为字符 类 保留的特殊字符)(\d+)?
- (第2组)1个或多个数字(可选组,可以为空)(?:/(\d+))?
- 非捕获可选组匹配/
- 文字/
(\d+)
-(第 3 组)1 个或多个数字。
\]
- 右方括号。