[英]C++ reverse regex_search
我正在使用std :: regex並希望在字符串中找到與某個用戶定義的正則表達式字符串匹配的最后位置。
例如,給定正則表達式:.*
和字符串“test:55:last”,我想找到“:last”,而不是“:55:last”。
為了澄清,作為一個用戶提供的正則表達式,我只是得到他們的正則表達式加上一個“反向”復選框,所以我可以改變正則表達式,但它必須以編程方式。
如果你有一個用戶提供的正則表達式,你無法改變,但你仍然需要最右邊的匹配,請用^.*(
和)
(或[\\s\\S]*
來包裝模式以匹配換行符)並抓取捕獲組1的內容:
"^.*(:.*)"
請參閱正則表達式演示
問題是上述模式匹配
^
- 字符串的開頭 .*
- 匹配除了換行符之外的任何0+字符(如果使用[\\s\\S]*
,所有字符將匹配) 盡可能多 (因為*
是一個貪婪的量詞) (:.*)
- 匹配的捕獲組 :
然后是除了換行符之外的任何0+字符。 請注意,第一個.*
實際上將獲取盡可能多的字符,直到行的末尾(並且在大多數情況下,如果沒有換行符,則它是字符串的結尾)。 然后發生回溯,正則表達式引擎將開始嘗試適應后續子模式的文本(這里,它將是用戶模式)。 因此,將被捕獲的用戶子模式將位於最右側位置。
一個示例(基本)C ++程序,展示了它如何工作:
#include <regex>
#include <string>
#include <iostream>
using namespace std;
int main() {
string user_pattern(":.*");
string s("test:55:last");
regex r("^.*(" + user_pattern + ")");
smatch matches;
if (regex_search(s, matches, r)) {
cout<<matches[1].str();
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.