【问题标题】:How can I terminate a string with regex_replace?如何使用 regex_replace 终止字符串?
【发布时间】:2013-02-27 05:12:57
【问题描述】:

我正在使用 CreateProcess 通过 Cygwin 的 bash.exe 运行 bash 脚本并重定向输出(因为这是客户想要的)。唯一剩下要解决的问题是,如果 ReadFile 没有填满 lpBuffer,我最终会在它的末尾有一堆垃圾字符,我想过滤掉它们。通常是这样的:

"ÌÌÌÌ...ÌÌÌÌÌuÆì¨õD"

下面的代码将为我提供:

"uÆì¨õD"

所以,我至少部分成功了=D

但是,我真正想要的是在第一个垃圾字符处终止字符串,最好也使用换行符,但我似乎找不到 fmt 的变体。

void ReadAndHandleOutput(HANDLE hPipeRead) {
char lpBuffer[256];
DWORD nBytesRead;
wstringstream wss;
while(TRUE)
{
    if(!ReadFile(hPipeRead, lpBuffer, sizeof(lpBuffer), &nBytesRead, NULL) || !nBytesRead)
    {
        break;
    }

    // Filter out the weird non-ascii characters.
    std::string buffer(lpBuffer); 
    std::regex rx("[^[:alnum:][:punct:][:space:]]+"); 
    std::string fmt("\n\0");
    std::regex_constants::match_flag_type fonly = std::regex_constants::format_first_only;
    std::string result = std::regex_replace(buffer, rx, fmt, fonly);
    wss << result.c_str();
}
SetWindowText(GetDlgItem(HwndMain, IDC_OUTPUT), LPCWSTR(wss.str().c_str())); }

【问题讨论】:

  • 函数不应该返回读取的字节数吗?您可以清空缓冲区的其余部分。
  • 确实如此,结果证明是正确的解决方案,但需要进行一项修改:我的缓冲区需要比传递给 ReadFile 的最大大小值大一个元素,这样我才能确保它始终为空终止。

标签: regex visual-studio-2010 winapi visual-c++


【解决方案1】:

我不确定用正则表达式修复它是否正确。我相信你应该在输入完成的地方放一个\0,你可以通过检索读取的字符数来找到位置。

但是,这些是 可打印(非垃圾)ASCII 字符集:

[ -~]

这是从空格到波浪号的字符集。

所以这是想要的模式:

[^ -~]+

【讨论】:

  • 在这两个方面都正确。这种模式更接近我想要的,但正确的解决方案是使用 nBytesRead。
猜你喜欢
  • 1970-01-01
  • 2017-06-02
  • 2018-01-20
  • 2011-01-09
  • 2010-11-12
  • 2021-10-16
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
相关资源
最近更新 更多