为什么这个Regex.Match失败了?

时间:2014-08-14 06:02:08

标签: c# regex

我有这个小方法来查找字符串中的3位数字并将其递增1。我传入的字符串类型类似于CP1-P-CP2-004-DMOT03-C-FP04-003

char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

foreach (char c in alphabet)
{
    m = Regex.Match(s, @"\d{3}(?=[" + c + "-]|$)");
}

if (m.Success)
{
    int i = Convert.ToInt32(m.Value); i += 1;
    Console.WriteLine(s + " - " + i.ToString("D3"));
}
else { Console.WriteLine(s + " - No success"); }

编辑:最初我就是这样;测试我的Regex.Match案例:

Match m = Regex.Match(s, @"\d{3}(?=[A-]|$)");

它与CP1PCP2001A无关,但是当我更新它并尝试CP1PCP2001C时,它返回"没有成功",而CP1PCP2001没有问题。谁能告诉我为什么会这样?

3 个答案:

答案 0 :(得分:2)

你试过吗

m = Regex.Match(s, @"\d{3}(?=[A-Z\-]|$)");

[A-Z]表示它可以是A和Z之间的任何大写字母,因此无需char[] alphabet\-允许您添加' - '作为参数,不会与第一个参数发生冲突。

答案 1 :(得分:1)

从评论中,我们正在寻找"前3位数字(来自右侧)"。这是一个文字实现:

m = Regex.Match(s, @"\d{3}", RegexOptions.RightToLeft);

这比其他答案更容易接受意外的角色。您可以决定您的申请是好还是坏。

答案 2 :(得分:0)

以这种方式重写代码

bool matched = false;
foreach (char c in alphabet)
{
    m = Regex.Match(s, @"\d{3}(?=[" + c + "-]|$)");

    if (m.Success)
    {
        int i = Convert.ToInt32(m.Value); i += 1;
        Console.WriteLine(s + " - " + i.ToString("D3"));
        matched=true;
        break;
    }
}
if(!matched)
    Console.WriteLine(s + " - No success");

更好的方法是不循环并指定要在正则表达式中匹配的char范围

例如

    m = Regex.Match(s, @"\d{3}(?=[A-Z\-]|$)");

    if (m.Success)
    {
        int i = Convert.ToInt32(m.Value); i += 1;
        Console.WriteLine(s + " - " + i.ToString("D3"));
    }
    else
       Console.WriteLine(s + " - No success");

正则表达式demo here