Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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中如何匹配条件#_C#_Regex - Fatal编程技术网

C# 在C中如何匹配条件#

C# 在C中如何匹配条件#,c#,regex,C#,Regex,我有一根这样的绳子 string strex = "Insert|Update|Delete" 我正在检索另一个字符串作为string strex1=“Insert”(它可能检索更新或删除) 我需要将C#中“IF”条件下的strex1与strex匹配 我是否需要拆分strex并与strex1匹配?我能想到的有效方法是使用 使用Linq、字符串strexby'|和检查strex1的解决方案是否存在于数组中,如 @PanagiotisKanavos在 评论 使用 或使用, 如

我有一根这样的绳子

string strex = "Insert|Update|Delete"
我正在检索另一个字符串作为
string strex1=“Insert”
(它可能检索更新或删除) 我需要将C#中“IF”条件下的
strex1
strex
匹配


我是否需要拆分
strex
并与
strex1
匹配?

我能想到的有效方法是使用


使用Linq、字符串
strex
by'|和检查
strex1
的解决方案是否存在于数组中,如

@PanagiotisKanavos在 评论

使用

或使用,

如果要在比较字符串时忽略大小写,则可以使用
StringComparison.OrdinalIgnoreCase

if(strex.Split('|').Any(x => x.Equals(strex1, StringComparison.OrdinalIgnoreCase))
{
   //Your code goes here
}

您发布的字符串是与单词
插入
更新
删除
匹配的模式。正则表达式是web应用程序中指定验证规则的一种非常常见的方法

正则表达式可以表达比简单比较复杂得多的规则。在验证场景中,它们也比拆分快得多(想想10倍)。在web应用程序中,这意味着使用更少的服务器来服务相同的流量

您可以使用.NET将字符串与该模式匹配,例如:

var strex = "Insert|Update|Delete";
if (Regex.IsMatch(input,strex))
{
....
}
这将每次创建一个新的正则表达式对象。您可以通过创建一个静态Regex实例并重用它来避免这种情况。Regex是,这意味着从多个线程使用同一实例没有问题:

static Regex _cmdRegex = new Regex("Insert|Update|Delete");
...
void MyMethod(string input)
{

    if(_cmdRegex.IsMatch(input))
    {
    ...
    }
}
如果模式出现在模式中的任何位置,则Regex类方法将匹配
Regex.IsMatch(“Insert1”,strex)
将返回
True
。如果需要精确匹配,则必须指定模式从输入的开头开始,以
^
结尾,以
$
结尾:

static Regex _cmdRegex = new Regex("^(Insert|Update|Delete)$");
通过此更改,
\u cmdRegex.IsMatch(“Insert1”)
将返回false,但
\u cmdRegex.IsMatch(“Insert”)
将返回true

性能

在这种情况下,正则表达式比拆分和尝试精确匹配快得多。随着时间的推移,考虑10-100倍。原因有两个:

  • 字符串是不可变的,因此像
    Split()
    这样的每个字符串修改操作都将生成新的临时字符串,这些字符串必须被分配和垃圾收集。在一个繁忙的web应用程序中,这会增加,最终会消耗大量的RAM和CPU,但几乎没有或根本没有任何好处。ASP.NET核心比旧ASP.NET快10倍的原因之一是尽可能消除了此类子字符串操作
  • 正则表达式被编译成以最有效的方式执行匹配的程序。使用
    Split().Any()
    时,程序会将输入与所有子字符串进行比较,即使很明显没有可能的匹配,例如因为第一个字母是
    Z
    。另一方面,只有当第一个字符是
    I
    U
    D

  • 这是非常低效的-它将在每个字符串中创建3个新字符串execution@PanagiotisKanavos,感谢您指出我代码中的低效之处。我在上一个解决方案中解决了您的问题,请检查它。代码现在根本不起作用。if(strex.Split(“|”).Any(x=>x==strex1))将是最好的解决方案,但我建议使用带有忽略大小写的equals方法,而不是在此处使用==。i、 e.if(strex.Split(“|”).Any(x=>x.Equals(strex1,System.StringComparison.OrdinalIgnoreCase)))谢谢Prasad。我试过你的密码。这也在起作用。谢谢你的帮助!
    var strex = "Insert|Update|Delete";
    if (Regex.IsMatch(input,strex))
    {
    ....
    }
    
    static Regex _cmdRegex = new Regex("Insert|Update|Delete");
    ...
    void MyMethod(string input)
    {
    
        if(_cmdRegex.IsMatch(input))
        {
        ...
        }
    }
    
    static Regex _cmdRegex = new Regex("^(Insert|Update|Delete)$");