Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对匹配失败的组进行“自动”更正_C#_Regex - Fatal编程技术网

C# 对匹配失败的组进行“自动”更正

C# 对匹配失败的组进行“自动”更正,c#,regex,C#,Regex,我有这样一个正则表达式: ([A-Z]{2})([0-9]*)([A-Z]{1}) M**1**0133776311I 通过这个,我将验证如下代码: MD0133776311I 所以,当我得到错误的代码时,我想知道根据一些简单的规则自动进行更正的最佳方法,这些规则取决于匹配的组 例如,如果我有这样的代码: ([A-Z]{2})([0-9]*)([A-Z]{1}) M**1**0133776311I regexp失败,因为前两个字符不是文本第一匹配组,因此程序应该对第二个字符串字符应用更

我有这样一个正则表达式:

([A-Z]{2})([0-9]*)([A-Z]{1})
M**1**0133776311I
通过这个,我将验证如下代码:

MD0133776311I
所以,当我得到错误的代码时,我想知道根据一些简单的规则自动进行更正的最佳方法,这些规则取决于匹配的组

例如,如果我有这样的代码:

([A-Z]{2})([0-9]*)([A-Z]{1})
M**1**0133776311I
regexp失败,因为前两个字符不是文本第一匹配组,因此程序应该对第二个字符串字符应用更改,将1替换为,例如,I


要做到这一点,最好的方法是利用正则表达式?

如果给定代码不是以两个字母开头,可以使用替换映射替换索引1处的字符:

using System;
using System.Text;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public class Test
{
    private static string[] productCodes = new[] { 
        "MD0133776311I",
        "M10133776311I",
        "M20133776311I"
    };

    private static Dictionary<char, char> replacementMap = new Dictionary<char, char> {
        { '1', 'I' },
        { '2', 'S' },
    };

    private static Regex startsWithTwoLettersRegex = new Regex("^([A-Z]{2})");

    public static void Main()
    {
        foreach (var code in productCodes)
        {
            Console.Write("{0} -> ", code);
            if (!startsWithTwoLettersRegex.Match(code).Success)
            {
                Console.WriteLine(FixProductCode(code));
            }
            else
            {
                Console.WriteLine("OK!");   
            }
        }
    }

    static string FixProductCode(string code)
    {
        StringBuilder sb = new StringBuilder(code);
        sb[1] = replacementMap[code[1]];
        return sb.ToString();
    }
}

我相信你可以把它塑造成更灵活的东西,但正如我在评论中所说的,正则表达式无法猜出你的意思。您需要在代码中明确显示,并手动将字符固定在字符串中的设置位置


注意,如果第一个字符不是字母,那么它不会修复第一个字符,也不会检查代码的其余部分

正则表达式猜不出你的意思您需要确定并编写要应用的规则。你总是想用大写字母i替换第二个字符吗?例如,如果第二个数字是1,我总是想用i替换。我有匹配规则,比如两个字面值,然后是一些数字,最后一个字面值,根据其他简单规则,我必须更改一些字符,使代码与初始regexp一致。是的,但这只是一个示例。你可以用Regex.Replace^[A-Z]{1}[1]这样的东西来做,如果它是一个2怎么办?如果是2,例如s。请阅读我对前面评论的编辑;那么,阅读我之前的评论,您需要编写这些规则。代码不能与示例一起使用,您需要明确。