【问题标题】:C# Regex.Split() does not work as expectedC# Regex.Split() 不能按预期工作
【发布时间】:2017-07-07 15:06:16
【问题描述】:

我正在 C# 中试用服务,因此无法使用 Console.WriteLine(...) 调试值。这就是为什么我不知道最后我的变量号是什么:

    public int addAndSoustractNumberFromAString(string ustr)
    {
        int result = 0;

        if(!string.IsNullOrEmpty(str))
        {
            string str = ustr.Trim();

            //Regexes
            System.Text.RegularExpressions.Regex valid_regex = new System.Text.RegularExpressions.Regex(@"[\+]\d+|[\-]\d+");
            System.Text.RegularExpressions.Regex invalid_regex = new System.Text.RegularExpressions.Regex(@"[a-zA-Z]");

            //Handling errors
            if (invalid_regex.IsMatch(str) || !valid_regex.IsMatch(str) || !Char.IsDigit(str[str.Length - 1])) return 0;
            if (Char.IsDigit(str[0])) str = "+" + str;

            //Load all numbers in a string array
            List<string> numbers = new List<string>(valid_regex.Split(str).ToArray());

            //Cast string numbers to int + result calculation
            foreach (string number in numbers) { if (!int.TryParse(number, out int n)) return 99; result += n; }
        }

        return result;
    }

我的代码是什么? 我输入加法和减法,它执行操作并将结果作为整数返回。

示例: 如果我输入 "52-2+3" 它应该返回 53

问题: 我的代码总是返回 99,这意味着解析失败。 以防万一,我尝试了int.TryParse("-2", out int n),它工作正常。

线路不工作:

List&lt;string&gt; numbers = new List&lt;string&gt;(valid_regex.Split(str).ToArray());

我的正则表达式很好,我在regexstorm net 网站上对其进行了测试。

我的问题是,为什么我的字符串没有使用假定的有效正则表达式正确拆分? Regex.Split() 没有做我认为的事情吗? (我认为它会将我的字符串拆分为 +number 或 -number 字符串

旁注:不以符号开头也没关系。如果我的字符串以数字开头,它将在末尾添加“+”以用于正则表达式。

【问题讨论】:

  • 为什么要在对 TryParse 的调用中声明一个 int ?你不想得到这个值吗?您是否尝试过声明 int n; 然后 int.TryParse(number, out n)
  • 是的,它适用于我的其他方法。以防万一我测试了它仍然显示99。可以在函数TryParse中声明它。
  • 你不能把这段代码放到控制台应用程序中并在那里调试吗?
  • 人们很认真地投票不说话...我在这里发布之前测试了很多东西...:/不,我不能,它使用 ISS,Console.WriteLine(... ) 不起作用。

标签: c# regex


【解决方案1】:

您的 Regex 不是 Split()ing Regex。

Split() 期望正则表达式定义分隔符(即以逗号或分号分隔)。您的正则表达式描述了这些值。

您似乎想要 Matches() 而不是 Split() 的结果。

你的例子似乎对我有用:

List<string> numbers = valid_regex.Matches(str).Cast<Match>().Select(m => m.Value).ToList();

另外,LinqPad 是一个很棒的工具,可以像这样对 sn-ps 代码进行原型设计。

【讨论】:

  • 它的工作!所以正如预期的那样,我误解了 regex.split() 函数。谢谢!
【解决方案2】:

将您的正则表达式替换为([\+\-]\d+) 可以使用示例"52-2+3" here

还在拆分后添加了.Where(x =&gt; !String.IsNullOrEmpty(x)).ToList();,以便您摆脱空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多