正则表达式一次查找多个匹配的项目

时间:2012-09-14 04:37:58

标签: c# regex match regex-group

所以这是字符串: “DC:PPE环境:CH1切片:无论提取什么” 或“babaasdfsd DC:PPE asdfas Env:CH1或Slice:what”

基本上我试图找到“DC:PPE”“Env:CH1”“Slice:whatever”并删除它们。

我正在使用以下正则表达式:(c#)

Regex r = new Regex(
    @"(?:
    (?<captured>(?:^|\s+)Slice|Env|Dc:.*?\s+)()
  ){1}
  \1",

(?:^|\s+)我试图匹配Slice | Env | Dc出现在开头或者带有前导空格。  使用.*?\s+我试图在DC:PPE之后非贪婪地匹配空格。

我想让它一起归还所有三场比赛。 这有什么问题?

string combinedTestSTring = "DC:PPE Env:CH1 Slice:whatever  to extract";

Regex r = new Regex(
    @"(?:
    (?<captured>(?:^|\s+)Slice|Env|Dc:.*?\s+)()
  ){1}
  \1",

RegexOptions.IgnorePatternWhitespace|RegexOptions.IgnoreCase);


var a = r.Matches(combinedTestSTring);

1 个答案:

答案 0 :(得分:0)

这是否符合您的要求:

Regex r = new Regex(@"\b(:?Slice|Env|Dc):.+?)\b");

\b匹配单词边界。然后它匹配Slice|Env|Dc后跟:,然后匹配至少一个字符,直到另一个字边界。

您不能同时归还所有比赛。返回匹配数组时,每个元素对应于regexp中的不同捕获组。如果您有一个包含重复计数或通配符的组,则返回的匹配只是找到的最后一个匹配,而不是所有匹配。所以你必须编写一个遍历输入字符串的循环,返回每个匹配。

但是,如果您只想全部替换它们,r.Replace()将会这样做,因为它会替换字符串中的所有匹配项。