具有多个Var变量的RegEx

时间:2013-07-24 16:53:34

标签: c# regex var

如果您决定将此代码放入编译器中,您会注意到Implicitly-typed local variables must be initlialized上出现var match错误。但我不太确定如何以任何其他方式进行此检查(对于text.count())。有时候我的OCR会丢失一个字母或其他内容,如果有的话,字符数会减少,这会使match变量返回null ...让我没有结果。

此外,对于奖励积分,任何可以帮助清理我的REGEX表达的人都很好......我刚开始使用它并且我在语义方面还不太熟练。

var match;
if (wordList[i].Text.Count() < 12)
{
    match = Regex.Match(wordList[i].Text, @"c[:;i]ty[!l1;:i/][5s][tuj!l/]z[i;:l]p[c1:;zs]", RegexOptions.IgnoreCase);
}
else
{
    match = Regex.Match(wordList[i].Text, @"c[:;i]ty[!l1;:i/][5s][tuj!l/][f!l1j;:i/]z[i;:l]p[c1:;zs]", RegexOptions.IgnoreCase);
}
if (match.Success)
{ ... }

5 个答案:

答案 0 :(得分:3)

如果没有初始化,则无法声明var。使用

Match match;

或者,如果你真的必须,

dynamic match;//I don't recommend this

Var是隐式类型变量,您必须为其提供值以推断实际类型。请参阅here

答案 1 :(得分:0)

请查看doc

  

从Visual C#3.0开始,在方法中声明的变量   scope可以有一个隐式类型var。隐式键入的本地   变量是强类型的,就像你声明了类型一样   你自己,但编译器确定了类型。

声明变量时,需要使用显式键入方式,或执行

var match = new Match(); 

答案 2 :(得分:0)

你必须给编译器一些东西,以便它可以推断出类型是什么。例如,这将起作用:

var match = (Match)null;

因为编译器知道var应该是Match

为什么你想在Match match;之上做这件事是超出我的,但它确实有效。

答案 3 :(得分:0)

在不查看正则表达式模式的情况下,我建议您可以通过将“模式决策逻辑”与其余代码分开来破坏代码。

下面我提供了2个单独的例子来说明如何解决这个问题。第一个定义了一个DeterminePattern方法,它只返回要用作正则表达式模式的字符串。第二个定义了一个FindMatch方法,它返回相应的Match对象。

从技术上讲,其中任何一个都允许你继续使用var关键字,但在我看来,这并不是那么重要......正如我所看到的,这里的好处是让代码更易于阅读和理解。你可以自己决定是否打破这样的代码。

示例1

private static string DeterminePattern(string input)
{
    if (input.Count() < 12)
    {
        return @"...";
    }

    return @"...";
}


var match = Regex.Match(wordList[i].Text, DeterminePattern(wordList[i].Text), RegexOptions.IgnoreCase);
if (match.Success)
{ ... }

示例2

private static Match FindMatch(string input)
{
    if (input.Count() < 12)
    {
        return Regex.Match(input, @"...", RegexOptions.IgnoreCase);
    }

    return Regex.Match(input, @"...", RegexOptions.IgnoreCase);
}

var match = FindMatch(wordList[i].Text);
if (match.Success)
{ ... }

答案 4 :(得分:0)

保持 DRY :不要重复自己。

如果你必须使用var(即使你不这样做:特别是在这种情况下使用var是什么意思?),这个结构更好:

string text = wordList[i].Text ;
string pattern = text.Length < 12
               ? @"c[:;i]ty[!l1;:i/][5s][tuj!l/]z[i;:l]p[c1:;zs]"
               : @"c[:;i]ty[!l1;:i/][5s][tuj!l/][f!l1j;:i/]z[i;:l]p[c1:;zs]"
               ;
Match match = Regex.Match( text , pattern , RegexOptions.IgnoreCase ) ;

或者,更好的是:

string text  = wordList[i].Text ;
Regex  rx    = text.Length < 12 ? Regex1 : Regex2 ;
Match  match = rx.Match( text , pattern , RegexOptions.IgnoreCase ) ;
.
.
.
private static readonly Regex1 = new Regex( @"c[:;i]ty[!l1;:i/][5s][tuj!l/]z[i;:l]p[c1:;zs]" , RegexOptions.IgnoreCase ) ;
private static readonly Regex2 = new Regex( @"c[:;i]ty[!l1;:i/][5s][tuj!l/][f!l1j;:i/]z[i;:l]p[c1:;zs]" , RegexOptions.IgnoreCase ) ;

为什么你在使用Linq(Wordlist[i].Text.Count())来获取字符串的长度呢?字符串已经知道长度。没有必要迭代它来计算字符:只需通过查询其Length属性来询问字符串多长时间。