在已检查的匹配项上收到的C ++正则表达式空字符串

时间:2015-04-11 00:24:48

标签: c++ regex

我正在编写一个C ++程序来隔离部分HL7消息。

我在regex101的PCRE正则表达式测试器上测试了我的示例文本中的正则表达式语句,这些语句是这样的消息:

MSH|^~\&|CERNER||PriorityHealth||||ORU^R01|Q479004375T431430612|P|2.3|
PID|||001677980||SMITH^CURTIS||19680219|M||||||||||929645156318|123456789| PD1||||1234567890^LAST^FIRST^M^^^^^NPI|
OBR|1|341856649^HNAM_ORDERID|000002006326002362|648088^Basic Metabolic Panel|||20061122151600|||||||||1620^Hooker^Robert^L||||||20061122154733|||F|||||||||||20061122140000|
OBX|1|NM|GLU^Glucose Lvl|59|mg/dL|65-99^65^99|L|||F|||20061122154733|

当我在测试仪上测试时,我会收到诸如" 001677980"或" CURTIS"或者" SMITH"。 但是,当使用std :: regex_match功能时,当我循环遍历这些消息时,我会得到空字符串。我已经检查过消息是否正确插入到messageList向量中。

我正在获得正则表达式A的正确值,但我得到相同的值5次,而不更改每条消息。

我在这里有一个功能:

void getBasicPatientInfo(){
        for (int i = 0;i < fileCount;i++) {
            std::string s(messageList[i]);
            std::regex a("PID(?:[^|]*\\|){3}([^|^]*)");
            std::regex b("PID(?:[^|]*\\|){5}(?:[^^]*\\^)([^|^]*)");
            std::regex c("PID(?:[^|]*\\|){5}([^|^]*)");
            std::smatch sma;
            std::smatch smb;
            std::smatch smc;
            std::regex_match (s,sma,a);
            std::regex_match (s,smb,b);
            std::regex_match (s,smc,c);
            int pID;
            std::istringstream inBetween (sma[1]);
            inBetween >> pID;
            std::cout << pID << std::endl;
            patientIDs.push_back(pID);
            patientFNames.push_back(smb[1]);
            patientLNames.push_back(smc[1]);
            messageDates.push_back(smd[1]);
        }
        for (int i = 0;i < fileCount;i++) {
            std::cout << patientIDs[i] << std::endl;
        }
        for (int i = 0;i < fileCount;i++) {
            std::cout << patientFNames[i] << std::endl;
        }
        for (int i = 0;i < fileCount;i++) {
            std::cout << patientLNames[i] << std::endl;
        }
    }

我想知道如何正确使用正则表达式来回复我在正则表达式101上测试过的部分内容。

我将索引1插入到其他向量中,因为这是我在别处看到的。将索引0插入到其他向量中会产生所有15个打印都为空的结果。

1 个答案:

答案 0 :(得分:1)

应该使用

Regex_search,而不是regex_match。该程序现在输出消息的正确部分。