簡體   English   中英

模式匹配和識別模式類型

[英]Pattern matching and identifying the pattern type

嘗試使用我們擁有的一些查找數據,但沒有太多解釋如何使用模式。 看起來類似於正則表達式字符串,但有一些額外的字符使它們無效並導致嘗試將它們用作正則表達式模式進行匹配時出錯。

例如。 要檢查的模式列表:

ABHH9***113+
GYER0-08G
DVTYYT53***

用於檢查模式的字符串將是產品名稱代碼。 例如這樣的事情:

DVTYYT53A12
DVTYYT53A33
ABHHYUU11344

如果我有一個名稱字符串列表和一個要搜索的模式列表,那么可以執行哪種模式匹配,對於每個名稱,我需要查看模式字符串列表中是否有匹配項。

但是,當將此表達式“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 };

這給了我:

結果

請注意,我將您的模式ABHH9***113+ABHH***113+以提供更完整的結果。

如果給我這個任務,我會分兩步完成。

1 獲取模式的規范

您獲得的模式不符合任何眾所周知的標准。

一種選擇是找到這些模式的來源,並詢問它們的含義。 如果這是不可能的,您可以通過查看大量示例並弄清楚所有特殊字符的含義來嘗試對它們進行逆向工程。

2 使用模式

一旦您弄清楚這些模式的含義,您就可以通過多種方式中的一種來匹配它們。

首先,您可以嘗試將它們轉換為正則表達式。 例如,您可以使用正則表達式查找一組 '*' 字符,計算您有多少個,然后將其交換為等效的正則表達式。

另一種方法是編寫您自己的匹配代碼,它一次一個字符地遍歷字符串,並根據模式檢查它們,並根據需要實施規則。

編碼

在我們對第 1 步有明確的答案之前,真的不可能幫助第 2 步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM