【问题标题】:C++ regex split after first whitespaceC++ 正则表达式在第一个空格后拆分
【发布时间】:2016-12-03 23:25:30
【问题描述】:

我有一个字符串如下:

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

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

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

我最接近的只是用分号分隔它,但 &lt;object&gt; 和 wave 最终被读取为一行。

编辑:这是我正在使用的拆分功能

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);
}

【问题讨论】:

  • ; 之间的元素是否总是以字母/单词字符开头?
  • 分号的数量是固定的吗?
  • 中间的元素;总是以字母或数字开头,分号的数量不固定。我正在处理的其他一些字符串有更多分隔符
  • 如果捕获次数未知,您不能使用一个正则表达式来执行此操作。或者至少你必须给我们一个正则表达式迭代器而不是捕获组。
  • 我个人不会为此使用正则表达式。使用字符串操作会很简单。

标签: c++ regex


【解决方案1】:

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

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

并替换为"$1$2"。请参阅regex demo

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

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

regex demo

匹配:

  • ^\S+ - 字符串开头有 1+ 个非空白字符
  • | - 或 -\b[^;]+ - 单词边界后跟 1+ 个字符,而不是 ;。它应该可以工作,因为元素以数字/字母开头(根据您的 cmets)。

示例 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

【讨论】:

  • 您可以通过取消引用迭代器来避免创建std::smatchi-&gt;str()(它已经是一个 std::smatch)。
  • 它不适用于我的。这可能是我正在使用的拆分功能——我更新了我的问题以包含它。
  • 我说使用 matching 而不是 splitting,并将匹配推送到字符串向量中。见ideone.com/VpelBH
  • @AlyssaJune 不,它在您的新示例中不起作用(很好)。您的原件既没有括号也没有过多的空格,所以我不希望设计用于处理原始示例的正则表达式与您的新示例一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2014-05-14
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多