簡體   English   中英

如何在C ++中使用正則表達式標記化來捕獲重復模式

[英]How to capture repeated patterns using regex tokenization in C++

我的問題是關於C ++中的正則表達式標記化。

我有以下正則表達式模式:

**const regex PRx ("^ TxD = <(@&[^(@&)]{1,32}@&){2,}>;");**

還有我正在從文件中讀取的以下字符串對象(其中可能有許多字符串):

 TxD = <@&Mag@&@&Hael@&@&Io12n@&>;

 TxD = <@&Atx@&@&Depoc@&@&Lsadiz@&@&gfhg@&@&kdkdj@&>;

請注意,每個字符串的開頭都有一個空格(如錨^后面的正則表達式PRx中所示)。

以下代碼負責相應地解析上述模式

vector<DFG> IP; // DFG is a class type

vector<int> MIS;
MIS.push_back(1);

const sregex_token_iterator Endx;

for (sregex_token_iterator IPF(DOC.begin(), DOC.end(), PRx, MIS); IPF != Endx;)
{
    string SIN = (*IPF).str().c_str(); 
    IPF++;      
    IP.push_back(DFG(SIN));  /* The constructor of DFG is responsible for pushing SIN to a 
                                 vector data member object of string type */ 
}

如正則表達式模式PRx所示,它試圖捕獲定界符“ @&”之間的所有模式; 但是,問題在於它僅捕獲最后一個匹配的模式。 例如,在第一個字符串中,它將僅報告“ @&Io12n @&”,而在第二個字符串中,它將僅報告“ @&kdkdj @&”。

第一個字符串的預期輸出是(出於說明目的):

@&Mag@&
@&Hael@&
@&Io12n@&

從第二個字符串開始是(出於說明目的):

@&Atx@&
@&Depoc@&
@&Lsadiz@&
@&gfhg@&
@&kdkdj@&

(請注意,上面顯示的輸出將不顯示,而是將找到的每個模式分別保存在SIN向量對象中)

僅當我刪除了模式“ ^ TxD = <”和“>;”時,它才有效。 並從PRx中檢查范圍“ {2,}”,而我不想這樣做。 我不確定為什么它無法捕獲所有模式! 您能否提供對此事的想法和評價。

謝謝!

如果您的正則表達式引擎支持\\G ,則可以使用此模式

(?:^\sTxD\s=\s<(?=(?1){2,}>;$)|\G)(@&[^@&]{1,32}@&)(?=(?1)|>;$)

演示版


根據下面的評論,我認為您需要使用兩種不同的正則表達式模式,第一種基於條件^ TxD{2,}{1,32}>;過濾數據>; 首先,像這樣

^\sTxD\s=\s(?=<((@&[^@&]{1,32}@&){2,})>;$)

演示版
並在第一個比賽上執行另一個簡單的模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM