C# 正则表达式非贪婪匹配

C# 正则表达式非贪婪匹配,c#,regex,C#,Regex,如果我有以下简化字符串: string331-itemR-icon253,string131-itemA-icon453, string12131-itemB-icon4535,string22-itemC-icon443 如何仅使用正则表达式获取以下内容 string12131-itemB-icon4535, 所有数字都是未知的。唯一已知的部分是 itemA、itemB、itemC、字符串和图标 我尝试了string.+?itemB.+?,,但它也从第一次出现的string

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

        string331-itemR-icon253,string131-itemA-icon453,
string12131-itemB-icon4535,string22-itemC-icon443
如何仅使用正则表达式获取以下内容

string12131-itemB-icon4535,
所有数字都是未知的。唯一已知的部分是 itemA、itemB、itemC、字符串和图标

我尝试了
string.+?itemB.+?,
,但它也从第一次出现的
string
而不是与itemB相邻的字符串中提取

我也尝试过在itemB前面的不同位置使用
[^icon]
,但无法使其工作。

尝试以下方法:

string[^,]+itemB[^,]+,
试试这个:

string[^,]+itemB[^,]+,
试试这个正则表达式

 string\d+-itemB-icon\d+,
试试这个正则表达式

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

您没有提到逗号分隔项是一个已知的部分,但在示例regex中使用了它,因此我假设它可以用于解决方案中。尝试将逗号作为字符集排除,而不是与“.”匹配。

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

使用受限字符集而不是通配符的给定解决方案是最简单的,但为了更深入地了解一般问题:非贪婪量词部分正确,但是,不贪婪并不能阻止匹配者根据需要选择尽可能多的字符来查找匹配项。您可能正在寻找操作员,
(?>组)。
一旦组匹配某个内容,如果匹配者需要回溯,则将对其进行原子处理

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

在您的示例中,组匹配
string331项
,但
B
R
不匹配,因此整个组被抛出,搜索移动到下一个
字符串

使用受限字符集而不是通配符的给定解决方案最简单,但要进一步了解一般问题:非贪婪量词部分是正确的,但非贪婪并不能阻止匹配器获取查找匹配所需的尽可能多的字符。您可能正在寻找操作员,
(?>组)。
一旦组匹配某个内容,如果匹配者需要回溯,则将对其进行原子处理

(?>string.+?item)B.+?,
在您的示例中,组匹配
string331项
,但
B
R
不匹配,因此整个组被抛出,搜索移动到下一个
字符串