如何使用regex_replace终止字符串?

时间:2013-02-27 05:12:58

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

我正在使用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())); }

1 个答案:

答案 0 :(得分:1)

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

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

[ -~]

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

所以这是所需的模式:

[^ -~]+