C++ 正则表达式在第一个空格后拆分

标签 c++ regex

我有一个字符串如下:

{ <object> waves   ;              big    yellow       flowers ;          slugs       ; }

我需要想出一个正确的正则表达式来在第一个空格之后拆分它,然后只用分号拆分,这样在一个 vector 中,它看起来如下:

s.at(0) = <object>
s.at(1) = waves
s.at(2) = big yellow flowers
s.at(3) = slugs

我最接近的只是用分号将它分开,但是 <object>波最终被读成一行。

编辑:这是我正在使用的拆分函数

vector<string> split(const string &input, const string &regex, bool delim = true) {
std::regex re(regex);

std::sregex_token_iterator first, last;
if (delim) {
    first = sregex_token_iterator{input.begin(), input.end(), re};
} else {
    // the -1 removes the delimiter
    first = sregex_token_iterator{input.begin(), input.end(), re, -1};
}
return vector<string>(first, last);
}

最佳答案

编辑:由于您更新了您的输入,下面的建议将在一些预处理后起作用:您需要删除过多的空格和前导/尾随大括号。

std::regex r(R"(^[{\s]+|[}\s]+$|\s*(;)\s*|(\s)+)");

并替换为 "$1$2"。查看regex demo .

你只能通过匹配来实现,而不是拆分。正则表达式是

^\S+|\b[^;]+

参见 regex demo

它匹配:

  • ^\S+ - 字符串开头的 1+ 个非空白字符
  • | - 或 -\b[^;]+ - 单词边界后跟除 ; 之外的 1+ 个字符。它应该有效,因为元素以数字/字母开头(根据您的评论)。

示例 C++ 代码:

#include <string>
#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::regex r(R"(^\S+|\b\w[^;]*)");
    std::string s = "<start> sunlight; small red flowers; trees;";
    for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
      i != std::sregex_iterator();
      ++i)
    {
        std::smatch m = *i;
        std::cout << m.str() <<  '\n';
    }
    return 0;
}

参见 C++ demo

关于C++ 正则表达式在第一个空格后拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953661/

相关文章:

c++ - 如何仅在输入变量后而不是立即开始使用 getline?

c++ - 如何测试 argc 然后将默认值分配给 argv[1]?

java - 是否可以使用正则表达式限制特定路径中接受的文件

java - 如何将文本效果应用于 { } 大括号内的单词

Bash if 语句中的正则表达式匹配

php - 使用或不使用协议(protocol)验证 URL

Java转义正则表达式元字符和构造

c# - 将结构数组从 C++ 转换为 C# 时出现问题

c++ 代码在 FreeBSD 上没有捕获异常

c++ - 如何在类构造函数中使用 C++11 随机引擎和均匀分布?