具有多个Var变量的RegEx

本文关键字:变量 RegEx Var | 更新日期: 2023-09-27 18:24:50

如果你们决定将这些代码放入编译器中,你们会注意到我在var match上得到了一个Implicitly-typed local variables must be initlialized错误。但我不太确定如何以任何其他方式进行此检查(对于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)
{ ... }

具有多个Var变量的RegEx

如果不初始化var,就不能声明它。使用

Match match;

或者,如果你真的必须,

dynamic match;//I don't recommend this

Var是一个隐式类型的变量,您必须为它提供值,以便推断实际类型。请参见此处。

请签出文档。

从Visual C#3.0开始,在方法中声明的变量scope可以具有隐式类型var。隐式类型的local变量是强类型的,就像您声明了类型一样您自己,但由编译器决定类型。

当您声明一个变量时,您需要使用显式类型化的方式,或者进行

var match = new Match(); 

你必须给编译器一些东西,这样它才能推断出类型是什么

var match = (Match)null;

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

我无法理解你为什么要在Match match;上这样做,但它确实有效。

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

下面我提供了两个单独的例子来说明如何将其分解。第一个定义了一个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)
{ ... }

保持干燥:不要重复。

如果你必须使用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属性来询问字符串的长度即可。