我可以在带开关盒的c#中使用正则表达式吗?

时间:2017-03-10 00:21:56

标签: c# regex

我可以像这样在c#中编写switch case吗?

switch (string)

case [a..z]+

//   do something

case [A..Z]+

//   do something

....

5 个答案:

答案 0 :(得分:16)

是的,你可以在C#7:

switch (someString)
{
    case var someVal when new Regex(@"[a..z]+").IsMatch(someVal):
        // do something
        break;
    case var someVal when new Regex(@"[A..Z]+").IsMatch(someVal):
        // do something
        break;
}

答案 1 :(得分:4)

使用_作为丢弃词,对David的出色回答进行了细微的改进。 只是一个非常简单的字符串值作为示例。

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main()
    {
        string userName = "Fred";
        int something = 0;

        switch (true)
        {                
            case bool _ when Regex.IsMatch(userName, @"Joe"):
                something = 1;
                break;

            case bool _ when Regex.IsMatch(userName, @"Fred"):
                something = 2;
                break;

            default:            
                break;
        }    
        Console.WriteLine(something.ToString());
    }
}

答案 2 :(得分:3)

你应该可以这样做:

using System.Text.RegularExpressions;

private void fauxSwitch(string caseSwitch)
{
    if(Regex.Match(caseSwitch, @"[a..z]+").Success)
    {
        //do something
        return;
    }

    if(Regex.Match(caseSwitch, @"[A..Z]+").Success)
    {
        //do something
        return;
    }

    /*default*/
    //do something
}

虽然,C#7中的模式匹配可能是更好的选择。

答案 3 :(得分:2)

没有。在C#(7之前)中,switch语句只接受常量值。

如您所建议的那样使用更复杂的表达式是一种称为'模式匹配的功能'在函数式编程世界中。

模式匹配包含在C#7

答案 4 :(得分:1)

从 C# 8.0 开始,现在答案是肯定的!......有点。

在 8.0 中,引入了 switch expression。您可以使用它来匹配许多不同样式的图案,如下所示。

string myValueBeingTested = "asdf";
        
string theResultValue = myValueBeingTested switch
{
    var x when 
        Regex.IsMatch(x, "[a..z]+") => "everything is lowercase",
    var y when
        Regex.IsMatch(y, "[A..Z]+") => "EVERYTHING IS UPPERCASE",
    "Something Specific"            => "The Specific One",
    _                               => "The default, no match scenario"
};

工作原理:switch 表达式需要一个变量,它可以将结果输入到其中。上面的示例为此使用了 theResultValue 变量。接下来,将上面的myValueBeingTested 表示的范围表达式 传递给开关。熟悉的case 构造被替换为模式表达式,后跟=> 标记,并一起称为表达式n 臂arm 标记右侧的任何内容都将在结果变量中结束。

通常switch 表达式要求模式是编译时常量,并且您不能在switch 表达式中执行任意代码。但是,我们可以使用 case gaurd 模式,通过使用 when 子句来使用 Regex,如上所示。每个案例都需要连接到具有不同一次性变量的不同 arm 中(上面的 xy)。

上面显示的第三个 arm 是一个编译时常量字符串,可根据需要匹配某些特定文本。上面显示的第四个 arm 使用 _ 模式,这是一种类似于旧的 default: 关键字的通配符。您还可以使用 null 代替 _ 或除 > db.test.find({ }) 之外单独处理 null 情况。

在我的 .NET Fiddle sample here 中试用。