0

所以这里是字符串:“DC:PPE Env:CH1 Slice:whatever to extract”或“babaasdfsd DC:PPE asdfas Env:CH1 or Slice:whatever”

基本上我试图找到“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);
4

1 回答 1

0

这是否符合您的要求:

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

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

您不能同时返回所有匹配项。返回匹配数组时,每个元素对应于正则表达式中的不同捕获组。如果您有一个具有重复计数或通配符的组,则返回的匹配只是找到的最后一个,而不是全部。所以你必须编写一个遍历输入字符串的循环,返回每个匹配项。

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

于 2012-09-14T04:59:10.997 回答