具有多个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
,就不能声明它。使用
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
属性来询问字符串的长度即可。