用自定义输入

时间:2017-10-31 18:09:54

标签: c# .net regex

我正在尝试使用自定义输入替换捕获的子组。但是,我可以在C#正则表达式中找到合适的方法。 我想替换任何出现的字符' O'或者'我'在数字之间。 因此,如果存在' 123O56'(存在字符O),则应将其转换为' 123056'(字符O转换为零)。

代码在C#中

using System.Text.RegularExpressions;
public string ConvertCharToInt(string address)
        {
            string input = address;

            string checkPattern = @"\d+[OI]\d+";
            string patternO = @"\d+(O)\d+";
            string patternI = @"\d+(I)\d+";

            Regex regxO = new Regex(patternO, RegexOptions.IgnoreCase);
            Regex regxI = new Regex(patternI, RegexOptions.IgnoreCase);

            if (Regex.IsMatch(input, checkPattern)){

                if (regxO.IsMatch(input))
                {
                    input = regxO.Replace(input, @"0",2);

                }
                else
                {
                    input = regxI.Replace(input, "1");
                }
            }

            return input;
        }

我正在尝试使用组号,但在提供组号时,我无法提供自定义替换字符串。

1 个答案:

答案 0 :(得分:2)

您捕获一个组以提取数据,保留某些文本,而不是删除/替换这些文本。

您可以在数字之间匹配OI,并在匹配评估者中将O替换为0,将I替换为1

var dct = new Dictionary<string, string>();
dct.Add("O", "0");
dct.Add("I", "1");
var s = "9O9 8I8";
var result = Regex.Replace(s, @"(?<=\d)[OI](?=\d)", m => dct[m.Value]);
Console.WriteLine(result); // => 909 818

请参阅C# demo

此处,(?<=\d)[OI](?=\d)模式匹配数字之间的OI,值(m.Value)用作在字典中查找相应值的键

使用捕获组:

var result = Regex.Replace(s, @"(\d)([OI])(\d)", 
            m => $"{m.Groups[1].Value}{dct[m.Groups[2].Value]}{m.Groups[3].Value}");

请参阅another C# demo