正则表达式非贪婪的匹配

时间:2012-10-22 00:49:16

标签: c# regex

如果我有以下简化字符串:

        string331-itemR-icon253,string131-itemA-icon453,
string12131-itemB-icon4535,string22-itemC-icon443

如何仅使用正则表达式获得以下内容?

string12131-itemB-icon4535,

所有数字都不详。唯一已知的部分是 itemA,itemB,itemC,string和icon

我已尝试string.+?itemB.+?,,但它也会从第一次出现的string而不是与itemB相邻的那个出现

我也尝试在各个位置使用itemB之前的[^icon],但无法使其工作。

4 个答案:

答案 0 :(得分:3)

试试这个:

string[^,]+itemB[^,]+,

答案 1 :(得分:2)

试试这个正则表达式

 string\d+-itemB-icon\d+,

答案 2 :(得分:2)

使用限制字符集而不是通配符的给定解决方案是最简单的,但要在一般问题上获得更多:你得到非贪婪量词部分,但非贪婪不会阻止匹配从需要尽可能多的角色找到匹配。您可能正在寻找 atomic group 运算符,(?>group).一旦组匹配某些内容,如果匹配器需要回溯,它将以原子方式处理。

(?>string.+?item)B.+?,

在您的示例中,该群组与string331-item匹配,但BR不匹配,因此整个群组都会被投放,搜索会移至下一个string

答案 3 :(得分:0)

您没有提及将项目分隔为已知部分的逗号,但在示例正则表达式中使用它,因此我假设它可以在解决方案中使用。尝试将逗号排除为字符集,而不是与“。”匹配。