为什么这个正则表达式不能返回正确的匹配?

时间:2015-03-17 03:52:15

标签: c# regex

我正在尝试返回字符串的一部分,我想在第一个斜线之前返回所有内容:

EC22941C/02/ORI

应该给我:EC22941C

我使用http://www.regexr.com/来构建我的表达式:

(EC.+?)\/.+

根据我的文字进行测试时:

EC22941C/02/ORI

它正确告诉我第一组是

EC22941C

当我把它放入C#:

 public static string GetInstructionRef(string supplierReferenceId)
    {
        // The instruciton ref is the bit before the slash            
        var match = Regex.Match(supplierReferenceId, @"(EC.+?)\/.+");

        if (match == null || match.Groups.Count == 0)
            return "";

        // Return the first group which is the instruction ref
        return match.Groups[0].Value;
    }

我得到的结果是:

EC22941C/02/ORI

我尝试了许多不同的模式,他们似乎都做了同样的事情。

有谁知道我做错了什么?

3 个答案:

答案 0 :(得分:1)

问题是您返回了错误的组索引,0将返回整个匹配,而1返回捕获括号的匹配上下文 - 从左到右编号。

return match.Groups[1].Value;

答案 1 :(得分:1)

^EC[^\/]+

您可以简单地使用它并避免使用组。参见演示。

https://regex101.com/r/bW3aR1/6

string strRegex = @"^EC[^\/]+";
Regex myRegex = new Regex(strRegex, RegexOptions.Multiline);
string strTargetString = @"EC22941C/02/ORI";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Add your code here
  }
}

答案 2 :(得分:0)

您应该使用match.Groups[1].Value

match.Groups[0].Value返回整个字符串(如果它与模式匹配)。

此外,您还想更改if条件。 :)