Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模式匹配与模式类型识别_C#_Regex - Fatal编程技术网

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 };