2015-10-15 59 views
8

我想找到所有可能的匹配正则表达式,它怎么可能?如何获得所有可能的匹配std :: regex

regex rx("(2|25)"); 
string s = "2225"; 
for (sregex_iterator it(s.begin(), s.end(), rx), end; it != end; ++it) { 
    cout << it->position() << ": " << it->str() << endl; 
} 

给出输出:

0: 2 
1: 2 
2: 25 

,但无法找到第三2: 2准确。我更喜欢使用正则表达式,因为O(n)复杂度用于同时搜索多个令牌。

UPDATE:

也许分裂标记列表非prefixable列表和创建几个正则表达式?例如:(2|4|25|45|251|455|267) =>(2|4)(25|45|267)(251|455)这将增长的复杂性类似O(n log(m))

更新2:

请,非prefixable矢量以提供分离标记向量的短基于STL-算法回答这个问题。

+0

如果您只想匹配'2',为什么要使用'| 25'作为你的正则表达式? – Phylogenesis

+0

@Phylogenesis我想发现所有4个匹配的'O(n)'复杂性:) – k06a

+0

我相信你不能匹配两个不同匹配组中的同一个字符(即,你将不能匹配'2' 25',但也是它自己的)。 – Phylogenesis

回答

2

我不认为这是可能的一个迭代器和一个正则表达式。这是它的工作原理。

您的正则表达式搜索“2”“25”的子字符串。现在,您开始搜索sregex_iterator。它从字符串的第一个符号开始,并试图找到与您的正则表达式匹配。如果匹配,则它被“记录”,并且迭代器被提前到匹配后的位置。如果没有匹配,则迭代器向前推进1个位置。这个过程一直持续到字符串结束。

现在,每次找到匹配项时,它都会尝试从正则表达式中找到最好的(即最长的)匹配项。因此,如果子字符串匹配225,则它会花费25,因为它更长。所以我会说你需要2个正则表达式。

+0

帮助我避免'm'正则表达式,每个将只包含1个标记:)复杂性增长到'O(nm)':( – k06a

+1

我不认为它实际匹配最长的匹配,它匹配* first *匹配。交替的顺序很重要:请看这个[example](http://ideone.com/Jgq9pZ)。 – Phylogenesis

+0

@Phylogenesis,这很吸引人,因为在我的机器上结果正好相反('rx1'找到'2 2 25'和'rx2'找到'2 2 2') – SingerOfTheFall

1

你不能获得第三个'2',因为正则表达式总是返回最长匹配。为了获得“所有可能的匹配”,您需要运行查询两次,因为2包含在25中。