C#模式匹配失败

C#模式匹配失败,c#,regex,pattern-matching,C#,Regex,Pattern Matching,下面是我用来查找形式为RB\d{4}、SW\d{4}和S\d{4}的中转号的代码: Regex transitRegex = new Regex("^(RB|SW?)(<?transit>\\d{4}).*"); Match m1 = transitRegex.Match(transitNumber); if (m1.Success) { Regex transitRegexNoZeroes = new Regex("0+(<?transitNoZeroes>\\

下面是我用来查找形式为RB\d{4}、SW\d{4}和S\d{4}的中转号的代码:

Regex transitRegex = new Regex("^(RB|SW?)(<?transit>\\d{4}).*");
Match m1 = transitRegex.Match(transitNumber);
if (m1.Success)
{
    Regex transitRegexNoZeroes = new Regex("0+(<?transitNoZeroes>\\d+)");
    Match m2 = transitRegexNoZeroes.Match(m1.Groups["transit"].Value);
    if (m2.Success)
    {
        transitNumber = m2.Groups["transitNoZeroes"].Value.ToString();
        MessageBox.Show(transitNumber, "Transit Number", MessageBoxButtons.OK);
    }
    else
    {
        transitNumber = m1.Groups["transit"].Value.ToString();
    }
}
else
{
    MessageBox.Show("Could not find transit number in " + transitNumber, "Parsing Error", MessageBoxButtons.OK);
}
我一辈子都搞不清楚正则表达式出了什么问题。任何建议都将不胜感激

问候


编辑:对内部匹配进行编辑,以允许带前导零的数字仍然包含零。

您的第一个模式有点不正确。请尝试以下方法:

@"^(RB|SW?)(?<transit>\d{4})"
@(RB|SW?(\d{4})”

注意,问号的位置。您可以测试模式。

非零的目标是什么?它当前查找的数字可能以零开头,但不包含零。在上面的例子中,它应该返回72(至少乍一看是这样)。您是否确保您的行没有前导空格?回答这两个问题。我删除了前导空格中的“^”,但结果是一样的。至于非零,我知道每个运输编号都由四位数字表示,紧跟在这些特定字母代码之后。这些数字可能包含需要删除的前导零,以便与不同格式的运输编号进行比较。你是对的,内部匹配是不正确的,因为剥离的数字仍然可以合法地包含零——但我甚至没有提到内部代码。对不起,我应该清楚的是,在示例输入中失败的是外部匹配。[用手敲击前额]非常感谢!我所做的就是看着正则表达式。我完全错过了那个语法错误。
@"^(RB|SW?)(?<transit>\d{4})"