我遇到了子串的问题,我有一个下面格式的字符串 目前正在使用getline。
Richard[12345/678910111213141516] was murdered
我一直在使用find_last_of
和find_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个包含此字符串的子字符串。
我已经提到了正则表达式,但我不知道它是否更适合这项任务,我包含了标签,所以有更多经验的人可能会回答/评论。
答案 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位或更多位数。\]
- 关闭方括号。