2

在 linqpad 中玩弄它,我似乎无法让它工作。这是我在这里关注的原始业务逻辑。请注意,有一个业务需求:

您有一个提供给 regex.Match 的字符串,它将返回第一个匹配项以与测试值进行比较。测试值将由用户输入为“12345”或“ABCDE”(五位字母数字字符串)。如果他们输入了六个或更多字符,或者使用了无效字符,则应删除这些字符以取最右边的 5 个字符。

void Main()
{
  var r = @"^(?:[^\p{L}\\<>~=,-]|[A-Za-z0-9])+$";
  var rg = new Regex(r);
  var test = "J99-291-098";
  var m = "91098";
  rg.Match(test).Dump();

  //(m == rg.Match(test).Captures[0].Value).Dump();
}

我在这里做错了什么?我想要捕获的只是J99291098示例的(更具体地说是91098测试字符串的,但如果你能告诉我,J99291908我可以弄清楚如何只得到五个)。

我无法更改代码以使用 Regex.Replace,我无法更改代码以使用更多循环。如果仅使用 Regex.Match 不可能做到这一点,那么这就是答案,但我认为这是可以做到的。

4

1 回答 1

1

不 !!,它不会一次性为您完成所有剥离。

您需要做的是匹配感兴趣的字符,附加到一个字符串,然后修剪
最后 5 个字符的字符串。

我不知道你说的更多循环是什么意思。使用MatchorMatches会有一个循环。
匹配只是获得第一场比赛并停止。必须进行下一场比赛,直到没有比赛为止。
Matches 在一次调用中获取所有匹配项,但您仍然必须遍历 MatchCollection。

如果有帮助,这里有一些代码。

        string input = "J99-291-098";
        string output = "";

        Regex rxTest = new Regex( @"([A-Za-z0-9]+)" );
        MatchCollection All_matches = rxTest.Matches( input );
        foreach (Match match in All_matches)
            output += match.Groups[1].Value;

        int nn; 
        if ( (nn=output.Length) > 0)
        {
            nn -= 5;
            nn = nn > 0 ? nn : 0;
            Console.WriteLine("Matched  {0}", output.Substring( nn ) );
        }

        return;

 // Output:  Matched  91098

编辑另一种方法:

使用单个匹配,这里是如何获得你感兴趣的角色。

  Regex rxTest = new Regex(@"^(?:[^A-Za-z0-9]*([A-Za-z0-9]+))*[^A-Za-z0-9]*$");
  CaptureCollection cc1 = rxTest.Match(input).Groups[1].Captures;

如何获取数据cc1取决于您。

于 2013-11-14T22:39:05.567 回答