如何使用 C# 正则表达式简化此模式匹配逻辑
本文关键字:模式匹配 何使用 正则表达式 | 更新日期: 2023-09-27 18:32:05
早上好!希望有人能在这里帮助我进行一些模式匹配。
我想做的是将一串数字与一堆文本匹配。唯一的问题是我不想在我正在寻找的数字的左侧和/或右侧匹配任何有更多数字的东西(字母很好)。
这里有一些有效的代码,但似乎有三个IsMatch
调用是矫枉过正的。问题是,我不知道如何将其减少到一个IsMatch
呼叫。
static void Main(string[] args)
{
List<string> list = new List<string>();
list.Add("cm1312nfi"); // WANT
list.Add("cm1312"); // WANT
list.Add("cm1312n"); // WANT
list.Add("1312"); // WANT
list.Add("13123456"); // DON'T WANT
list.Add("56781312"); // DON'T WANT
list.Add("56781312444"); // DON'T WANT
list.Add(" cm1312nfi "); // WANT
list.Add(" cm1312 "); // WANT
list.Add("cm1312n "); // WANT
list.Add(" 1312"); // WANT
list.Add(" 13123456"); // DON'T WANT
list.Add(" 56781312 "); // DON'T WANT
foreach (string s in list)
{
// Can we reduce this to just one IsMatch() call???
if (s.Contains("1312") && !(Regex.IsMatch(s, @"'b[0-9]+1312[0-9]+'b") || Regex.IsMatch(s, @"'b[0-9]+1312'b") || Regex.IsMatch(s, @"'b1312[0-9]+'b")))
{
Console.WriteLine("'{0}' is a match for '1312'", s);
}
else
{
Console.WriteLine("'{0}' is NOT a match for '1312'", s);
}
}
}
提前感谢您提供的任何帮助!
~斯波克先生
您可以使用负面环视进行单次检查:
@"(?<![0-9])1312(?![0-9])"
(?<![0-9])
确保1312
前面没有数字,(?![0-9])
确保1312
之后没有数字。
您可以将字符类设置为可选匹配项:
if (s.Contains("1312") && !Regex.IsMatch(s, @"'b[0-9]*1312[0-9]*'b"))
{
....
看看惊人的雷格解释:http://tinyurl.com/q62uqr3
要捕获无效模式,请使用:
Regex.IsMatch(s, @"'b[0-9]*1312[0-9]*'b")
[0-9] 也可以替换为'd
您只能选择之前、之后或根本不选择任何字母
@"'b[a-z|A-Z]*1312[a-z|A-Z]*'b"
对于好奇的头脑 - 解决上述问题的另一种方法?
foreach (string s in list)
{
var rgx = new Regex("[^0-9]");
// Remove all characters other than digits
s=rgx.Replace(s,"");
// Can we reduce this to just one IsMatch() call???
if (s.Contains("1312") && CheckMatch(s))
{
Console.WriteLine("'{0}' is a match for '1312'", s);
}
else
{
Console.WriteLine("'{0}' is NOT a match for '1312'", s);
}
}
private static bool CheckMatch(string s)
{
var index = s.IndexOf("1312");
// Check if no. of characters to the left of '1312' is same as no. of characters to its right
if(index == s.SubString(index).Length()-4)
return true;
return false;
}
考虑与"131213121312"不匹配。