C# 模式匹配与模式类型识别
尝试使用我们拥有的一些查找数据,但没有对如何使用模式进行太多解释。看起来类似于正则表达式字符串,但有一些额外的字符使其无效,并导致尝试将其用作正则表达式模式进行匹配时出错 例如,要检查的模式列表:C# 模式匹配与模式类型识别,c#,regex,C#,Regex,尝试使用我们拥有的一些查找数据,但没有对如何使用模式进行太多解释。看起来类似于正则表达式字符串,但有一些额外的字符使其无效,并导致尝试将其用作正则表达式模式进行匹配时出错 例如,要检查的模式列表: ABHH9***113+ GYER0-08G DVTYYT53*** 用于检查模式的字符串将是产品名称代码。 例如,类似这样的事情: 如果我有一个名称字符串列表和一个要搜索的模式列表,那么可以执行什么样的模式匹配?对于每个名称,我需要查看模式字符串列表中是否有匹配项 但是,当使用此表达式DVTYYT
ABHH9***113+
GYER0-08G
DVTYYT53***
用于检查模式的字符串将是产品名称代码。
例如,类似这样的事情:
如果我有一个名称字符串列表和一个要搜索的模式列表,那么可以执行什么样的模式匹配?对于每个名称,我需要查看模式字符串列表中是否有匹配项
但是,当使用此表达式DVTYYT53***作为正则表达式模式时,额外的两个*字符会导致问题。这让我想到,我们拥有的这些模式字符串不是正则表达式,而是某种其他形式的模式,或者某种正则表达式替代品
需要明确的是,目前,DVTYYT53***模式表示DVTYYT53后跟任意3个字符,但至少3个字符
[更新]
这些模式是通配符,因此假设*=任何字母数字字符,+=任何包含前面字符的内容如果您可以确定每个非标准模式的合适替换项以转换为正则表达式,则可以使用这种方法:
var patterns = new[] { "ABHH***113+", "GYER0-08G", "DVTYYT53***" };
var codes = new[] { "DVTYYT53A12", "DVTYYT53A33", "ABHHYUU11344" };
var pattern2regex = new[]
{
new { pattern = "*", regex = "." },
new { pattern = "+", regex = ".+?" },
new { pattern = "-", regex = ".*?" },
};
var results =
from pattern in patterns
let regex = pattern2regex.Aggregate(pattern, (a, x) => a.Replace(x.pattern, x.regex))
from code in codes
where Regex.IsMatch(code, regex)
orderby code, pattern
select new { code, pattern };
这给了我:
请注意,我将您的模式ABH9***113+更改为ABHH***113+,以给出更完整的结果。如果我被赋予此任务,我将分两步完成 1获取图案的规格 您得到的模式不符合任何众所周知的标准 一种选择是找到这些模式的来源,并询问它们的含义。如果这是不可能的,您可以尝试通过查看大量示例来对它们进行反向工程,并找出所有特殊字符的含义 2.使用这些模式 一旦你弄明白了这些模式的含义,你就可以用几种方法中的一种来匹配它们 首先,您可以尝试将它们转换为正则表达式。例如,可以使用正则表达式查找一组“*”字符,计算有多少个,然后将其替换为等效的正则表达式 另一种方法是编写自己的匹配代码,它一次循环字符串一个字符,并根据模式检查它们,根据需要实现规则 编码
在我们对第1步有一个明确的答案之前,不可能真正帮助第2步。不是正则表达式。看起来更像*表示任意单个字符,+表示任意字符数或大于。也许是定制的?除非我误解了你的模式,否则我认为你提供的任何示例都不符合这些模式。或者***在DVT的情况下是否意味着任何长度…?问题是,我无法控制给定的模式。所以目前,DVTYYT53***模式意味着DVTYYT53后跟任意3个字符,但至少3个字符。但至少3个字符?这似乎是可疑的和模棱两可的。哦,如果你知道规则,那么这些肯定不是正则表达式。在正则表达式中,任何3,但至少3是{3,}或…+。它们不符合我认识到的任何东西,因此我投票认为它们是定制的实现。反编译使用它们的程序并查看?
var patterns = new[] { "ABHH***113+", "GYER0-08G", "DVTYYT53***" };
var codes = new[] { "DVTYYT53A12", "DVTYYT53A33", "ABHHYUU11344" };
var pattern2regex = new[]
{
new { pattern = "*", regex = "." },
new { pattern = "+", regex = ".+?" },
new { pattern = "-", regex = ".*?" },
};
var results =
from pattern in patterns
let regex = pattern2regex.Aggregate(pattern, (a, x) => a.Replace(x.pattern, x.regex))
from code in codes
where Regex.IsMatch(code, regex)
orderby code, pattern
select new { code, pattern };