0

早上好!希望有人可以通过一些模式匹配来帮助我。

我想要做的是将一串数字与一堆文本匹配。唯一的问题是我不想匹配任何在我正在寻找的数字的左侧和/或右侧有更多数字的东西(字母很好)。

这是一些有效的代码,但似乎有三个IsMatch调用是多余的。问题是,我不知道如何将它减少到一个IsMatch电话。

static void Main(string[] args)
{
    List<string> list = new List<string>();

    list.Add("cm1312nfi"); // WANT
    list.Add("cm1312");  // WANT
    list.Add("cm1312n"); // WANT
    list.Add("1312");    // WANT
    list.Add("13123456"); // DON'T WANT
    list.Add("56781312"); // DON'T WANT
    list.Add("56781312444"); // DON'T WANT

    list.Add(" cm1312nfi "); // WANT
    list.Add(" cm1312 ");    // WANT
    list.Add("cm1312n ");    // WANT
    list.Add(" 1312");       // WANT
    list.Add(" 13123456");   // DON'T WANT
    list.Add(" 56781312 ");  // DON'T WANT

    foreach (string s in list)
    {
        // Can we reduce this to just one IsMatch() call???
        if (s.Contains("1312") && !(Regex.IsMatch(s, @"\b[0-9]+1312[0-9]+\b") || Regex.IsMatch(s, @"\b[0-9]+1312\b") || Regex.IsMatch(s, @"\b1312[0-9]+\b")))
        {
            Console.WriteLine("'{0}' is a match for '1312'", s);
        }
        else
        {
            Console.WriteLine("'{0}' is NOT a match for '1312'", s);
        }
    }
}

提前感谢您提供的任何帮助!

〜先生。斯波克

4

5 回答 5

1

您可以使字符类可选匹配:

if (s.Contains("1312") && !Regex.IsMatch(s, @"\b[0-9]*1312[0-9]*\b"))
{
    ....

看看令人惊叹的 Regexplained:http ://tinyurl.com/q62uqr3

于 2013-09-19T15:31:39.807 回答
1

要捕获无效模式,请使用:

Regex.IsMatch(s, @"\b[0-9]*1312[0-9]*\b")

[0-9] 也可以替换为\d

于 2013-09-19T15:33:09.333 回答
1

您可以对单个检查使用否定环视:

@"(?<![0-9])1312(?![0-9])"

(?<![0-9])确保它1312之前没有数字,(?![0-9])确保它之后没有数字1312

于 2013-09-19T15:33:51.980 回答
0

您只能选择之前、之后或根本不选择的那些字母

@"\b[a-z|A-Z]*1312[a-z|A-Z]*\b"
于 2013-09-19T15:48:03.770 回答
0

对于好奇的人 - 解决上述问题的另一种方法?

        foreach (string s in list)
        {
            var rgx = new Regex("[^0-9]");
            // Remove all characters other than digits
            s=rgx.Replace(s,"");
            // Can we reduce this to just one IsMatch() call???
            if (s.Contains("1312") && CheckMatch(s))
            {
                Console.WriteLine("'{0}' is a match for '1312'", s);
            }
            else
            {
                Console.WriteLine("'{0}' is NOT a match for '1312'", s);
            }
        }
       private static bool CheckMatch(string s)
       {
            var index = s.IndexOf("1312");
            // Check if no. of characters to the left of '1312' is same as no. of characters to its right
            if(index == s.SubString(index).Length()-4)
               return true;
            return false;
       }

考虑不匹配“131213121312”。

于 2013-09-19T16:16:31.493 回答